我们提交 Pull Request 的时候有时候并不是一个 Commit 就完成的,往往会做一些修改,然后再提交 Commit,通常会走多轮,到最后就可能会有多个 Commit,这时候往往需要合并这些 Commits 为一个,然后 Manager 帮你 Merge。
这时候我们就需要使用 git rebase 了。
这里我并不打算详解 rebase,这是 Git book 做的事,这里只是记录一下自己做的一个过程。
关于 rebase 可以参看这几篇文章:
首先
查看需要合并的 Commits,比如如下形式:
- git log
- 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 这三个提交,我们运行
- git rebase -i <SHA-1 of Commit 1> # -i后面的参数为最后一个不需要合并的Commit,这里为Commit 1
然后出现交互框,出现三个 pick
- pick ... Commit Message 2
- pick ... Commit Message 3
- pick ... Commit Message 4
我们将后两个 pick 改成 squash,即:
- pick ... Commit Message 2
- squash ... Commit Message 3
- squash ... Commit Message 4
这里两个操作的区别是:
然后输入新的 Commit Message,保存,即合并成功,最后看只剩一个 Commit 了。
最后 Push 到 remote,这时会提示版本不合,因为本地这个进行了合并后,已经比 remote 老了,这时只需强推即可:
- git push -f <upstream> <localbranch>:<remotebranch>
最后,多个提交就变成了一个提交,可以被 merge 了。
注意,如果出现了什么不想看到的结果或者操作错误,可以使用
- git rebase --abort
进行挽救,即可恢复到 rebase 之前的状态。
如果只需合并两个 Commit,且又是最近的两个 Commit,其实可以更简单地使用:
- git reset --soft HEAD^1
- git commit --amend
来解决。
来源: http://www.tuicool.com/articles/6bqYfaj