问题引入
组里的工程项目使用git做版本管理。开发者一多,git的提交记录中出现了很多自动生成的commit.
类似于如下这种形式:
Merge branch 'dev' of ssh://XXX.XXX.XXX.XXX/~/Projects/Project_XXX into dev
这种提交记录是由于分支合并时没有人工编写新的合并记录。
此外,在整个版本树中还有很多无意义的临时提交。在推送给服务器之前应该把这些提交合并成有意义的形式。
例如 下面这种提交历史:
$ git log
aaaaa 继续修补BUG1
bbbbb 修补BUG1,发给测试组测试一下
ccccc 发现BUG1
应该直接合并成一个提交
ddddd 发现BUG1并进行了修改,测试通过
问题解决
为了将git历史上的多个commit进行合并, 我们需要用到的命令是git rebase, 针对上面的例子,类似的命令应该为。
git rebase -i HEAD~3
3就是你要合并的commit数目。
一般情况下, git会停下来,显示一个文本文件。要求你选择哪一个提交要被pick, 哪一个提交要被squash.
- squash的意思就是这个提交会被合并,然后压缩成新的提交。
- pick就是你要留下的那个提交。
简单的说,如果我有三个提交
aaaaa [pick]
bbbbb [squash]
ccccc [squash]
显然应该将最早的提交置为pick, 其余的是squash. 这里有一个例子。
rebase 命令执行后显示的样子:
pick f392171 Added new feature X
pick ba9dd9a Added new elements to page design
pick df71a27 Updated CSS for new elements
我们把它修改成:
pick f392171 Added new feature X
squash ba9dd9a Added new elements to page design
squash df71a27 Updated CSS for new elements
这个例子来自:Ariejan de Vroom [http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/]
然后执行合并。 需要注意的是,如果你曾经把这些commit提交到远端的git服务器上。 下次你Push之前要先在远端用
git reset --HARD commit_id
将远端的版本重置,否则Push会失败,并且恢复起来十分的麻烦。
好吧,我承认,我之所以会写出上面这一段,是因为我自己就这么干了。而且在我提交之后,其他同学还在我的版本上面做了其他修改。 现在要修改起来十分的麻烦。
下面我们就看一下怎么解决。
冲突解决
如果出现冲突, git会停下来。要求我们手动解决。
假设我们编辑了一个文本文件:
”#a.txt
ColdZoo is an idiot
当冲突发生时, git可能会把这个文件改成下面这个样子
” #a.txt
“<<<<<<< aaaaa
ColdZoo is an idiot
“======= bbbbb
ColdZoo is an idiot, he messed up the whole commit history.
“>>>>>>>>
为了解决冲突,我们需要打开VI, 选择我们需要的部分。修改,保存。
运行
$git add a.txt
告诉git,我们已经解决了这个文件的冲突。
然后运行
$git rebase --continue
继续rebase. 需要注意的是, git rebase每次对两个提交进行合并操作. 因此,上面解决冲突的工作可能需要重复多次。建议大家每解决一次冲突都暂存一下。
好了,写到这里关于git 提交记录美化的内容就完成了。 主要参考资料:
[1] Ariejan de Vroom的主页 [http://ariejan.net/2011/07/05/git-squash-your-latests-commits-into-one/]
小广告
平时做的小项目整合起来放进GITHUB了。取了一个自以为很萌的名字 yolo-bear. 欢迎大家送星星。
自以为很漂亮的 GitHUB Pages:
http://coldzoo.github.io/yolo-bear/