在合并到主分支之前,如何实用 git rebase 把几个提交合并起来

10 阅读2分钟

场景描述

我们在自己的分支开发一个功能时,一旦有阶段性地成果,就会 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