一、场景:
有时候我们修改一个Bug或者一段代码的时候, commit 一次之后,发现 Bug 没改对或者这段代码需要再优化之类的,改完之后又 commit 了一次或多次,这样就会感觉提交历史不太简洁,这个时候我们就希望只想保留一次提交历史记录,合并为一个完整的提交,该怎么办呢?
二、介绍rebase
rebase的作用简单点说就是可以对某一段线性提交历史进行编辑、删除、复制、粘贴;因此,合理使用rebase命令可以使我们的提交历史干净、简洁! 但是不要通过rebase对任何已经提交到公共仓库中的commit进行修改(你自己一个人玩的分支除外),如果是公用的推荐使用merge操作
三、具体操作
git log 查看提交历史记录 可以按s向下翻log
git log --oneline 可以一行展现
git rebase -i <提交id号>
其中-i的意思是--interactive,弹出交互式的界面让用户编辑完成合并操作,[startpoint] [endpoint]则指定了一个编辑区间,如果不指定[endpoint],如果不指定[endpoint],则该区间的终点默认是当前分支HEAD所指向的commit(注:该区间指定的是一个前开后闭的区间)。这里需要注意的一点是,你想将哪些提交合并,那你-i后面跟的提交号,应该是这些提交中最早的那个提交的前一个提交 。在查看到了log日志后,我们运行以下命令:
git rebase -i 36224db
或者
git rebase -i HEAD~3
然后我们会进入如下图的界面:
按i进入insert模式,就是可以编辑模式,然后按esc关闭编辑,:wq保存推出vi
图中注释部分是git为我们提供的命令说明。每一个commit id 前面的pick表示指令类型,git 为我们提供了以下几个命令:
pick:保留该commit(缩写:p)
reword:保留该commit,但我需要修改该commit的注释(缩写:r)
edit:保留该commit, 但我要停下来修改该提交(不仅仅修改注释)(缩写:e)
squash:将该commit和前一个commit合并(缩写:s)
fixup:将该commit和前一个commit合并,但我不要保留该提交的注释信息(缩写:f)
exec:执行shell命令(缩写:x)
drop:我要丢弃该commit(缩写:d)
最后修改完成后,保存退出。git log查看提交记录的变化。