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

4

35

I want to run a git rebase -i some-hash.

When I run it, I get the error:

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 [...]

That error seems specific to a single commit, as --allow-empty isn't an option I can pass to rebase.

Apparently --keep-empty IS an option I can pass to git rebase, but it doesn't seem to fix the problem.

How can I rebase, and tell git, don't worry if a commit in the rebase is ends up having no effect?

Sasaki answered 2/6, 2016 at 18:34 Comment(1)
I'm not rebasing a single commit.Sasaki
S
30

Seems like running:

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

Creates 2 squashed commits, instead of one. Running git rebase -i some-hash allows me to squash the 2 new commits into one.

Sasaki answered 2/6, 2016 at 19:9 Comment(3)
Thanks. This got me very close. I ended up with one extra commit after rebase was done, the one created by this first step. But doing another rebase to squash that out was successful. The approach by @Yar might be simpler: use rebase to "edit" the last of the commits to be squashed, then use "git reset HEAD^" to squash out any additional commits then proceed with --continue.Expound
git rebase -i HEAD~2 without needing to look up SHAOverdye
I have no idea how my repo got into the state of needing this, but this fixed it. Thank you.Thirtytwomo
B
5

If you are not rebasing a single commit and facing the same problem, the reason is the final result of your rebasing is an empty commit.

Assuming you don't want to commit the empty commit, let's say you have these two commits:

commit 1
commit 2

And you are getting the error when you want to merge these two commits (say by git rebase -i HEAD~2), the fix is to reset those two commits by doing the following command for two times:

git reset HEAD^
Bengal answered 15/2, 2018 at 21:48 Comment(0)
B
3

The error message1 is a bit misleading, since git rebase itself does not support --allow-empty. So we need another command that does. We could make another commit (like @z5h), but then you still have two commits that you need to fixup/squash.

The solution is actually quite simple:

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

This nicely prevents another commit from being created and directly results in an empty commit.


1 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^".
[emphasis added]

Bal answered 13/9, 2019 at 19:4 Comment(1)
The only correct answer! (that you can execute when the message comes up, rather than first having to abort and redo the whole rebase. Otherwise, @scalloway's solution works)Mazurka
X
2

I found the simplest solution was to just interactively rebase (git rebase -i {some head}) and then drop the commits that were causing issues (with d in the rebase screen).

If you know that the commits are direct mirrors of each other (squashing them will result in an empty commit), and trying to squash through rebase isn't working then simply removing the commits themselves works.

As painful as it sounds, you're fiddling with the history anyway so it helps to clean up.

Xl answered 9/1, 2020 at 14:43 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.