我试图合并2个提交为1,所以我遵循“压缩提交与rebase”从git就绪。
我跑
git rebase --interactive HEAD~2
在结果编辑器中,我将pick更改为squash,然后save-quit,但由于出现错误,重基操作失败
没有之前的提交就不能“squash”
现在我的工作树已经达到了这个状态,我很难恢复。
命令git rebase——interactive HEAD~2失败:
交互式改基已经开始
git rebase -continue失败
没有之前的提交就不能“squash”
因为我对几乎所有的东西都使用git,所以对我来说,即使在这里这样做也是很自然的。
假设我签出了branchX,在它的顶端有两个提交,其中我想创建一个合并它们内容的提交,我这样做:
git checkout HEAD^ // Checkout the privious commit
git cherry-pick --no-commit branchX // Cherry pick the content of the second commit
git commit --amend // Create a new commit with their combined content
如果我想更新branchX以及(我认为这是这个方法的缺点),我也必须:
git checkout branchX
git reset --hard <the_new_commit>
首先你应该检查你有多少提交:
git log
有两种状态:
一是只有两次提交:
例如:
commit A
commit B
(在这种情况下,你不能使用git rebase来做)你需要做下面的事情。
$ git reset --soft HEAD^1
$ git commit --amend
另一种情况是提交次数超过两次;你想合并提交C和D。
例如:
commit A
commit B
commit C
commit D
(在这种情况下,你可以使用git rebase)
git rebase -i B
而不是用“壁球”来做。剩下的就很简单了。如果你还不知道,请阅读http://zerodie.github.io/blog/2012/01/19/git-rebase-i/
如果您想合并两个最近的提交,而只使用旧的提交的消息,您可以使用expect自动化该过程。
我认为:
您使用vi作为编辑器
每次提交只有一行
我用git版本2.14.3 (Apple git -98)进行了测试。
#!/usr/bin/env expect
spawn git rebase -i HEAD~2
# change the second "pick" to "squash"
# down, delete word, insert 's' (for squash), Escape, save and quit
send "jdwis \033:wq\r"
expect "# This is a"
# skip past first commit message (assumed to be one line), delete rest of file
# down 4, delete remaining lines, save and quit
send "4jdG\r:wq\r"
interact