跳到主要内容

Git 合并多个提交

我们知道使用 git merge 可以将一个分支的更改添加到另一个分支。除了这种方式,我们还可以使用 git rebase 命令来完成这个工作。掌握使用 git rebase 合并多个提交的技巧,可以让项目的历史提交记录保持干净整洁,这对于大型开源项目尤其重要。

交互式 rebase 命令

我们知道,git rebase 命令可以将复制当前分支的所有提交,并将它们移动到指定分支上。当你在 feature 分支上工作时,并且 main 分支已经更新,这时候就可以使用 rebase 命令来同步 main 分支。

除此之外,我们还可以通过 -i 选项进入 rebase 的交互式界面,对 commit 提交进行修改。例如选择当前提交路径上的前 3 个提交:

git rebase -i HEAD~3

当你想修改正在使用的分支上的某些提交时,交互式 rebase 就非常有用。例如在 push 之前将多个提交合并为一个。

rebase 操作方法

rebase 交互式命令提供了多种操作方法,下面是常用的几种操作:

操作缩写作用
pickp保留该提交
rewordr修改提交附带消息
edite修改提交
squashs将提交合并到上一个提交中
fixupf将提交合并到上一个提交中,并且不保留提交的日志消息
execx在我们 rebase 的每一个提交的基础上运行命令
dropd删除提交

有了这些方法,我们就可以完全控制 git 提交。例如,如果想修改提交信息,就可以使用 edit;如果想和并提交,就可以使用 squash;如果想删除提交,就可以使用 drop

压缩多个提交

下面通过示例演示如何将多个提交压缩为一个提交,以获得更清晰的历史记录。

假设当前活动分支有 3 个待处理的提交,我们使用交互式 rebase 对它们进行控制:

git rebase -i HEAD~3

此时会打开默认文本编辑器,内容如下:

pick 82974d2 第一次提交
pick 650b25e 第二次提交
pick 9c4aa57 第三次提交

# 变基 b1f2bf8..9c4aa57 到 b1f2bf8(3 个提交)

现在,将“第二次提交”的 pick 修改为 squash,表示将该提交合并到上一个提交,即“第一次提交”。以此类推,将“第三次提交”的 pick 修改为 squash。

pick 82974d2 第一次提交
squash 650b25e 第二次提交
squash 9c4aa57 第三次提交

# 变基 b1f2bf8..9c4aa57 到 b1f2bf8(3 个提交)

简单起见,你也可以使用缩写 s 替代 squash,因此下面修改是等效的。

pick 82974d2 第一次提交
s 650b25e 第二次提交
s 9c4aa57 第三次提交

# 变基 b1f2bf8..9c4aa57 到 b1f2bf8(3 个提交)

修改完成后保存退出,例如在 Vim 中使用 :wq 指令保存并退出。

此时会打开另一个文本编辑器,让你为这次压缩合并填写 commit 信息。

# 这是一个 3 个提交的组合。
# 这是第一个提交说明:

第一次提交

# 这是提交说明 #2:

第二次提交

# 这是提交说明 #3:

第三次提交

这里以 # 开始的行将会被忽略,你可以删除它,或者保留也无所谓。删除多余的信息,重新输入提交信息,例如:

# 这是一个 3 个提交的组合。

合并第一次+第二次+第三次提交

注意,如果输入一个空的提交说明将会终止提交。

在 Vim 中再次输入 :wq 命令保存并退出。现在,使用 git log --oneline 命令,查看当前分支的历史提交记录:

d8703bf (HEAD -> master) 合并第一次+第二次+第三次提交
b1f2bf8 just test
d118ff2 first commit

这样,你已经成功将 3 个提交压缩成 1 个提交啦!