文章目录
  1. 1. 合并多个Commits
  2. 2. 后悔药
  3. 3. 简易方法

合并多个Commits

我们提交Pull Request的时候有时候并不是一个Commit就完成的,往往会做一些修改,然后再提交Commit,通常会走多轮,到最后就可能会有多个Commit,这时候往往需要合并这些Commits为一个,然后Manager帮你Merge。
这时候我们就需要使用git rebase了。
这里我并不打算详解rebase,这是Git book做的事,这里只是记录一下自己做的一个过程。

关于rebase可以参看这几篇文章:

首先git log查看需要合并的Commits,比如如下形式:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
commit 3ade56efc466c093d7e8e25c520293cesedc96cc
Author: xxx
Date: Wed Mar 1 12:31:10 2017 +0800

Commit Message 4

commit 546ffc32692d3f935feb9b04d6ecb66feda9560b
Author: xxx
Date: Mon Feb 20 15:28:40 2017 +0800

Commit Message 3

commit f48b8644013c23f132c3fe72f8cc38ea288e6f3d
Author: xxx
Date: Thu Feb 9 13:52:39 2017 +0800

Commit Message 2

commit fe72f8cc38ea288e6c3fe72f8cc38ea288e6f3de
Author: xxx
Date: Thu Feb 9 10:12:39 2017 +0800

Commit Message 1

比如说我们需要合并Commit 2-4这三个提交,我们运行

1
git rebase -i <SHA-1 of Commit 1>  # -i后面的参数为最后一个不需要合并的Commit,这里为Commit 1

然后出现交互框,出现三个pick

1
2
3
pick ... Commit Message 2
pick ... Commit Message 3
pick ... Commit Message 4

我们将后两个pick改成squash,即:

1
2
3
pick ... Commit Message 2
squash ... Commit Message 3
squash ... Commit Message 4

这里两个操作的区别是:

  • pick的意思是要会选择合并到这个commit
  • squash(挤压)的意思是这个commit会被合并到前一个commit

然后输入新的Commit Message,保存,即合并成功,最后看只剩一个Commit了。
最后Push到remote,这时会提示版本不合,因为本地这个进行了合并后,已经比remote老了,这时只需强推即可:

1
git push -f <upstream> <localbranch>:<remotebranch>

最后,多个提交就变成了一个提交,可以被merge了。

后悔药

注意,如果出现了什么不想看到的结果或者操作错误,可以使用

1
git rebase --abort

进行挽救,即可恢复到rebase之前的状态。

简易方法

如果只需合并两个Commit,且又是最近的两个Commit,其实可以更简单地使用:

1
2
git reset --soft HEAD^1
git commit --amend

来解决。

计算机相关 | CS.Related