我如何 `git rebase -i` 并防止 "You asked to amend the most recent commit, but doing so would make it empty."?

How do I `git rebase -i` and prevent "You asked to amend the most recent commit, but doing so would make it empty."?

我想运行一个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,如果变基中的提交最终没有效果,请不要担心?

好像是 运行:

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

创建 2 个压缩的提交,而不是一个。 运行 git rebase -i some-hash 允许我将 2 个新提交压缩为一个。

如果您没有对单个提交进行变基并面临同样的问题,原因是变基的最终结果是一个空提交。

假设您不想提交空提交,假设您有这两个提交:

commit 1
commit 2

当你想合并这两个提交时(比如 git rebase -i HEAD~2),你会收到错误,解决方法是通过执行以下命令 两次来重置这两个提交:

git reset HEAD^

错误信息1有点误导,因为git rebase本身不支持--allow-empty。所以我们需要另一个命令。我们可以再做一次提交(比如@z5h),但是你 仍然 有两个提交需要 fixup/squash.

解决方法其实很简单:

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

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


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

我发现最简单的解决方案是交互式变基 (git rebase -i {some head}),然后删除导致问题的提交(在变基屏幕中 d)。

如果您知道提交是彼此的直接镜像(压缩它们将导致空提交),并且尝试通过 rebase 压缩不起作用,那么只需删除提交本身就可以了。

虽然听起来很痛苦,但无论如何你都在摆弄历史,所以它有助于清理。