我试图合并2个提交为1,所以我遵循“压缩提交与rebase”从git就绪。

我跑

git rebase --interactive HEAD~2

在结果编辑器中,我将pick更改为squash,然后save-quit,但由于出现错误,重基操作失败

没有之前的提交就不能“squash”

现在我的工作树已经达到了这个状态,我很难恢复。

命令git rebase——interactive HEAD~2失败:

交互式改基已经开始

git rebase -continue失败

没有之前的提交就不能“squash”


当前回答

如果有多次提交,您可以使用git rebase -i将两个提交压缩成一个。

如果你只想合并两个提交,并且它们是“最近的两个”,可以使用以下命令将两个提交合并为一个:

git reset --soft "HEAD^"
git commit --amend

其他回答

你可以用

git rebase --abort

当你再次运行交互式rebase命令时,'squash;Commit必须在列表中选择Commit的下面

添加到@greg的答案后,你完成了所有的事情,即压缩提交,如果你做git push(原始提交将保留在分支),而如果你做git push -f origin提交将被删除。 例如,你合并了提交B和提交C,如果你使用git push,你将有提交B,提交C和提交BC,但如果你使用git push -f origin,你将只有提交BC

首先你应该检查你有多少提交:

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

假设你在自己的主题分支里。如果你想把最后两个提交合并成一个,看起来像一个英雄,就在你做最后两个提交之前分支提交(使用相对提交名称HEAD~2指定)。

git checkout -b temp_branch HEAD~2

然后在这个新分支中挤压提交另一个分支:

git merge branch_with_two_commits --squash

这将带来改变,但不会导致改变。所以只要承诺就行了。

git commit -m "my message"

现在您可以将这个新的主题分支合并回您的主分支。