Git的rebase命令

第一次做正式的项目,很谨慎,新开dev分支,每写一点点就提交,结果merge之后一看git log,发现dev分支的每一次提交都保留到master上了,很多也很乱,而且往Github上一推,光是我就这么多戏,人多起来这个log就很不好看了,所以想把dev上的多次提交压成一次,比如只保留最近的一次。查资料了解到可以用rebase命令实现。作文以记之。

用rebase压缩多个commit

以实验来说明。

实验环境

新建一个版本库,里面新建文件readme.txt,改动了5次,相应地提交了5次,每次提交,readme.txt的内容如下:

此时log如下:

实验目标

我想保留the first commit,把第2,3,4,5次提交压缩成一次。

实验过程

rebase的基本用法是这样:

git rebase -i [startpoint] [endpoint]

首先输入命令

git rebase -i 5eb115b

git rebase -i HEAD~4

-i表示interactive,5eb115b是First commit的版本号,作为startpoint,由于没有输入endpoint,故默认为当前HEAD所指的版本。这个区间指明了要实际操作的区间,并且是前开后闭的,即(startpoint, endpoint]。5eb115b可换成HEAD~4,是等价的。

然后Git会弹出文本编辑器,作为interact的手段,如下图。最上面4行是按提交时间从远到近排列的,和git log正好相反。仔细阅读注释部分,然后按需求编辑文本。

本实验将第2,3,4行开头的pick改成squash

值得说明的是,按我思维方式,应该要把2,3,4版往第5版融合,但是这里squash是向前融合,即把第3,4,5版融到第2版里去。这是没办法的,因为这里根本没有“向后融合”的选项。不过融合后保留的内容的确是最新版本,这个逻辑是不会错的,只是需要适当处理一下版本注释。

把上面的文本保存关闭后,会弹出另一个文本编辑器,是让你改版本注释的:

这里我们可以暂时先不改动,直接关闭。至此rebase操作成功了。

实验结果

此时看一下git log(不要用--pretty=oneline选项),如图:

等于是把2,3,4,5的版本合成一个版本了,它们的注释也都合起来了。查看一下readme.txt,确认的确是第5版的内容。

用rebase改版本注释

接前一部分,现在我想改掉那个版本的注释了。于是我可以再发起一次rebase:

git rebase HEAD~1

这次用HEAD~1。在第一个弹出文本编辑器里面把pick改成reword,reword=pick+改注释:

然后在第二个文本编辑器里就可以随心所欲地改注释了:

查看一下git log,成功了:

提一下,如果第一个文本编辑器里面保持pick,第二个文本编辑器就不会弹出来,直接rebase成功了,因为没有版本被squash,所以没有改注释的需求,故不弹出来。

当然,rebase命令活学活用还有其他很多功能,自己看说明就能懂。哈哈,越来越觉得Git是个好东西了。

参考文章:【Git】rebase 用法小结