Git 用法小结

来源:互联网 发布:ps素材软件 编辑:程序博客网 时间:2024/04/29 06:06

Git是一个开源的代码管理的强大工具,能很好的实现处理团队协作开发时的代码管理功能。

下面将有关git的常用操作做一个总结:

1)合并两次commit的提交纪录流程:

第一步: git rebase -i HEAD~2  //2就代表当前git log中最顶端的两次commit

第二步:弹出vi的编辑窗口,看到两行已pick开头的message,此时需将合并的commit message之前的pick改为squash或简写s,则合并后的commit msg为此时保留的pick之后的那一行。编辑完后命令行执行:wq

第三步:弹出commit msg的编辑窗口,把不要的msg行删掉,执行:wq保存退出。此时执行git log可以看到本地已经合并了。

第四步:push的远端服务器。执行git push -f,同步到远端git服务器。

注意:如果执行完第一步之后,弹出的vi编辑界面不正常(比如无法执行命令行),则可以执行git config --global core.editor /usr/bin/vim,则可以畅快的编辑了。

2)git 查看某一次提交的修改了哪些文件:

git log --oneline --stat (除了log信息,还包含修改文件的明细)

git log --oneline (依次显示commit的log信息,仅一行)

3)git回退服务器提交:

git reset --hard <commit_id>

git push origin HEAD --force

4) git 修改commit信息

对于修改最近一次提交的情况:

git commit --amend即可弹出vi修改编辑界面,修改完成:wq退出即可,如果代码已经push的origin,就要推到远端,如果分支对应,则执行

git push -f

对于修改中间某一次的信息,比如倒数第三次:

git rebase -i HEAD~3,之后会出来三行

这个命令出来之后,会出来三行东东: 
        pick:******* 
        pick:******* 
        pick:******* 

将需要修改的行的pick改为edit或e,然后wq保存退出,此时git log会发现刚修改为edit的commit已变为最新的提交,

之后执行git commit --amend ,就跟上一种情况一样了。修改完成还要把顺序理顺过来,执行:

git rebase --continue ,如果已经push到远端,则还需执行git push -f

5)git 撤销某次提交(只回退某次commit,而本地代码不会改动)

git reset --soft commit-id

6)重命名本地分支:

git branch -m oldbranchname newbranchname

7)删除远程分支:

git push origin :old-local-branch-name

或者git branch -r -d origin/branch_name

如果在删除之后使用git banch -a命令依然可以看到远程分支,则可执行git remote show origin查看分支状态:

kongbo@baal:/workspace/kongbo/release/light-vinci-en$ git remote show origin
* remote origin
Fetch URL: /workspace/vinci/vinci-light.git/
Push URL: /workspace/vinci/vinci-light.git/
HEAD branch: master
Remote branches:
factory tracked
master tracked
normal tracked
normal_international tracked
refs/remotes/origin/normal_test stale (use 'git remote prune' to remove)
Local branches configured for 'git pull':
master merges with remote master
normal_international merges with remote normal_international
Local refs configured for 'git push':
master pushes to master (local out of date)
normal_international pushes to normal_international (up to date)

可以看到红色标注的分支是不存在的,需要执行提示命令清除掉相关记录

执行

kongbo@baal:/workspace/kongbo/release/light-vinci-en$ git remote prune origin
Pruning origin
URL: /workspace/vinci/vinci-light.git/
* [pruned] origin/normal_test

可以看到,该分支记录在远端被彻底清除。

8)本地分支推送到远程:

git push origin  new-local-branch-name: new-local-branch-name

9)git推送代码遇到权限问题,日志如下:

kongbo@baal:/workspace/kongbo/release/vinci-light$ git push
Counting objects: 33, done.
Delta compression using up to 24 threads.
Compressing objects: 100% (29/29), done.
Writing objects: 100% (33/33), 22.06 KiB | 0 bytes/s, done.
Total 33 (delta 11), reused 0 (delta 0)
remote: error: insufficient permission for adding an object to repository database ./objects
remote: fatal: failed to write object
error: unpack failed: unpack-objects abnormal exit
To /workspace/vinci/vinci-light.git/
! [remote rejected] normal_international -> normal_international (unpacker error)
error: failed to push some refs to '/workspace/vinci/vinci-light.git/'

遇到这种问题需要登录到服务器端git仓储的根目录,具体到上述的问题就是/workspace/vinci/vinci-light.git/

然后执行如下操作:

ssh登录服务器

cd/workspace/vinci/vinci-light.git/

sudo chmod -R g+ws *
sudo chgrp -R mygroup *

git config core.sharedRepository true

通常在执行完红字标示的命令就可以在local端推送了。

针对该问题的原因分析可参考http://www.91r.net/ask/6494913.html这篇文章。

10)查看某个文件的改动记录:

git log --pretty=oneline file















2 0