场景描述
我们在自己的分支开发一个功能时,一旦有阶段性地成果,就会 commit 一次代码。当我们把一个功能完整地开发完时,往往有好几个提交记录,并且提交的 message 说的也比较随意,如果这时候直接向主分支 merge 代码,会让提交记录看上去很凌乱。所以为了有更完整清晰的提交记录,我们先把与这个功能有关的几个commit 合并成 1 个完整且有意义的 commit。
如何将多个 commit 合并成 1 个 commit 呢?就要使用git rebase命令。
现场情况
假设,我在dev分支有三个提交比较零碎的提交,为了简单,这三个 commit 的 message 分别是4,5,6。下面通过git log命令看一下。
$ git log --graph --oneline --decorate
* b243fa1 (HEAD -> dev) 6
* 6245522 5
* f13fad2 4
* 5914f41 (main) bar---1
* 42feff6 3
* b3cdc2c 2
* 4ce5158 1
开始合并提交
为了把他们合并起来,运行 git rebase命令,由于是要合并 3 个提交,所以使用HEAD~3,它表示要处理从 HEAD-3(不含)到 HEAD(含)这几个提交。
git rebase -i HEAD~3
词汇会出现一个 vim 编辑框,显示如下(#开头的内容可以看作是注释)
pick f13fad2 4
pick 6245522 5
pick b243fa1 6
这是 git 让我们选择要如何处理这三个提交。我把它修改为,
r f13fad2 4
f 6245522 5
f b243fa1 6
通过 :wq 命令退出 vim。下面是 r 和 f 的解释
r, reword <commit> = use commit, but edit the commit message
f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor
退出vim,git会解析上面的r f f,
- 会再次弹出vim,让reword commit 4的提交信息。这里我把提交信息修改为
4,5,6在一起,保存并退出vim。 - commit 5 和commit 6 保留文件的内容,但删去commit记录,让提交记录更整洁。
大功告成
查看一下现在的提交历史,发现4,5,6合并成1个提交了。大功告成。
git log --graph --oneline --decorate
* 8056a94 (HEAD -> dev) 4,5,6在一起
* 5914f41 (main) bar---1
* 42feff6 3
* b3cdc2c 2
* 4ce5158 1