如何使用`git rebase -i`并防止出现“您要求修改最近的提交,但这样会使其为空。”的错误提示?

34
我想运行 git rebase -i some-hash
当我运行它时,我遇到了错误:

You asked to amend the most recent commit, but doing so would make it empty. You can repeat your command with --allow-empty, or you can remove the commit entirely with "git reset HEAD^".
[...]
Could not apply [...]

这个错误似乎只适用于单个提交,因为--allow-empty不是我可以传递给rebase的选项。
显然,--keep-empty是我可以传递给git rebase的选项,但它似乎不能解决问题。
如何进行变基并告诉git,如果重复提交在变基期间没有效果,不要担心?

1
我不是在变基单个提交。 - Mark Bolusmjak
4个回答

29

看起来运行:

git commit --allow-empty
git rebase --continue

会创建 2 个压缩的提交,而不是一个。 运行 git rebase -i some-hash 可以让我把这两个新提交压缩成一个。


谢谢。这让我接近成功了。在rebase完成后,我最终多了一个提交,这是由第一步创建的。但是再次进行rebase以将其压缩成功了。@Yar的方法可能更简单:使用rebase来“编辑”要压缩的最后一个提交,然后使用“git reset HEAD^”来压缩任何其他提交,然后继续使用--continue。 - Ted
1
git rebase -i HEAD~2,无需查找SHA。 - Ka Mok
1
我不知道我的代码库为什么会处于需要这个的状态,但是这个解决了问题。谢谢。 - Jerred Shepherd

5
如果您不是在合并一个单独的提交,在面临相同问题,原因是您最终合并的结果是一个空提交。 假设您不想提交空提交,假设您有这两个提交:
commit 1
commit 2

当你想合并这两个提交(比如通过 git rebase -i HEAD~2 命令)时,出现错误,解决方法是重置这两个提交,具体操作如下,需要执行两次命令:

git reset HEAD^

3
错误信息1有点误导人,因为git rebase本身并不支持--allow-empty。所以我们需要另一个支持该选项的命令。我们可以像@z5h那样创建另一个提交,但这样你仍然需要修复/合并两个提交。
解决方案实际上很简单:
git commit --amend --allow-empty
git rebase --continue

这样可以很好地防止创建另一个提交,并直接导致一个空提交。

1您要修改最近的提交,但这样做会使其为空。您可以使用--allow-empty选项重复命令,或者您可以使用"git reset HEAD^"完全删除提交。
[强调添加]


唯一正确的答案!(当消息出现时,您可以立即执行,而不必先中止并重新执行整个rebase。否则,@scalloway的解决方案有效) - undefined

2
我发现最简单的解决方法就是交互式地重新排序(git rebase -i {some head}),然后删除导致问题的提交记录(在重新排序屏幕中使用d)。
如果您知道这些提交是彼此直接对应的(将它们压缩成一个提交会导致空提交),并且尝试通过重新排序来压缩不起作用,则直接删除提交本身即可。
虽然听起来很痛苦,但您已经在处理历史,因此清理一下会有所帮助。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接