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
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
$ git push -u origin master
上面命令将本地的master分支推送到origin主机,同时指定origin为默认主机,后面就可以不加任何参数使用git push了。
不带任何参数的git push,默认只推送当前分支,这叫做simple方式。此外,还有一种matching方式,会推送所有有对应的远程分支的本地分支。Git 2.0版本之前,默认采用matching方法,现在改为默认采用simple方式。如果要修改这个设置,可以采用git config命令。
$ git config --global push.default matching
# 或者
$ git config --global push.default simple
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
11)git 工程迁移:
git clone --bare git://192.168.10.XX/git_repo/project_name.git
su - git
cd /path/to/path/
mkdir new_project_name.git
git init --bare new_project_name.git
cd project_name.git
git push --mirror git@192.168.20.XX/path/to/path/new_project_name.git
cd ..
rm -rf project_name.git
git clone git@192.168.20.XX/path/to/path/new_project_name.git
注意:个别公司比如我司是创建了一个gitlab group,步骤a和b的操作直接在网页界面就已完成,只需从第三步开始推送git仓储的代码开始即可,然后可以新建目录或者清空当前目录去从新地址load代码也就是步骤e。