Git 多次提交合并成一次提交

Git 多次提交合并成一次提交

你在 dev 分支上开发某个功能,在本地执行了三次 commit,注意这三次 commit 都没有 push 到远程分支,都只是在本地存在。现在你想要在 push 之前,将你本地的这多个 commit 合并成一个 commit,请问应该怎么做?

答案是:git rebase -i HEAD~NN 代表你想把最近的几条 commitId 记录合并。具体操作步骤如下:

查看提交记录

git log 查看提交记录:

871adf OK, feature Z is fully implemented      --- newer commit --┐
0c3317 Whoops, not yet...                                         |
87871a I'm ready!                                                 |
643d0e Code cleanup                                               |-- Join these into one
afb581 Fix this and that                                          |
4e9baa Cool implementation                                        |
d94e78 Prepare the workbench for feature Z     -------------------┘
6394dc Feature Y                               --- older commit
  • 假设 6394dc 提交已经 push 上去了
  • 你现在想把 d94e78 ~ 871adf 这几个 commit 合并一下

即最终你再次执行 git log 想要看到的效果如下:

84d1f8 Feature Z                               --- newer commit (result of rebase)
6394dc Feature Y                               --- older commit

d94e78 ~ 871adf 共有 7 个 commit,因此执行命令:

git rebase -i HEAD~7

-i--interactive 参数的缩写表达,即交互的 rebase

现在只有 7 个 commit,数起来还简单一些。假设,我需要将 70 个 commit 合并,难不成我还要一个一个精确的数?答案是不需要。后面加上最后一次的 commitId 也可以,含义是从这个 commitId 之后的多个 commit 都要合并到一起,但是并不包含这个 commit

git rebase -i 6394dc

合并 commit 记录

执行 git rebase -i HEAD~7 命令后,你将会进入到命令行编辑其中(比如 Vi 中),然后选择这些 commit 如何进行合并。

在这个地方特别需要注意,在编辑器中,现在看到的旧的提交位于第一行,新的提交位于最后一行,顺序和 git log 查看的顺序颠倒了。

pick d94e78 Prepare the workbench for feature Z     --- older commit
pick 4e9baa Cool implementation 
pick afb581 Fix this and that  
pick 643d0e Code cleanup
pick 87871a I'm ready! 
pick 0c3317 Whoops, not yet... 
pick 871adf OK, feature Z is fully implemented      --- newer commit

然后下面其实也有注释:

# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell

下面对 ps 命令,简单解释:

  • p:这条 commit 依然保留,不要被去掉,这条 commit 的信息也依然维持原样,最终的 git log 也依然能看到这条 commit
  • s:将这条 commit 与前一次 commit 合并到一起

我们在编辑器中,使用 s 来将最近 6 次的 commit 合并到第一次 commit 上,修改如下:

pick d94e78 Prepare the workbench for feature Z     --- older commit
s 4e9baa Cool implementation 
s afb581 Fix this and that  
s 643d0e Code cleanup
s 87871a I'm ready! 
s 0c3317 Whoops, not yet... 
s 871adf OK, feature Z is fully implemented      --- newer commit

然后输入 :wq 保存编辑器的内容。

创建一个新的 commit

上述当离开编辑器的时候,Git 会再次弹出一个编辑器让你输入此次合并 commit 的信息输入界面:

Prepare the workbench for feature Z
Cool implementation 
Fix this and that  
Code cleanup
I'm ready! 
Whoops, not yet... 
OK, feature Z is fully implemented

你可以在这个地方修改信息,也可以直接使用 Git 给你生成好的信息,之后再次输入 :wq 保存即可。

参考

扫描下面二维码,在手机端阅读: