Re: git 2.24: git revert <commit1> <commit2> requires extra '--continue'?
- From
SZEDER Gábor <szeder.dev@gmail.com>
- Date
- Nov 23, 2019, 00:34 UTC
- Message-ID
- <20191123003454.GA23183@szeder.dev>
- In-Reply-To
- <CA+ASDXNQ+9i-6uCNDwN46cnHJeciiqQSX5Z6EaqB9pbseQhVFw@mail.gmail.com>
On Fri, Nov 22, 2019 at 03:10:20PM -0800, Brian Norris wrote:
Show 10 quoted lines
> Hi! I'm using git 2.24 (or, a variant of that packaged my distro -- I > can try to build my own if this is deemed not reproducible), and I > feel like I've been seeing a regression here: > > Previously, when reverting multiple commits (with the default --edit > behavior), as soon as I'm done editing the first revert commit > message, the second revert commit pops up an editor, and I'm on my > way. Now, it seems to require an extra 'git revert --continue' prompt > in between, yet it doesn't actually recommend that. This is highly > confusing, and seemingly unnecessary.
Thanks for the report, this is indeed a regression in v2.24.0: it bisects down to a47ba3c777 (rebase -i: check for updated todo after squash and reword, 2019-08-19) [Cc'ing Phillip]. It's not specific to 'git revert', but with a slight variation affects 'git cherry-pick' as well.
> An annotated transcript provided below.
I transcribed your transcript into tests that can be run in our test framework and demonstrate this regression:
--- >8 ---
#!/bin/sh
test_description='test'
. ./test-lib.sh
test_expect_success "Brian's revert regression" ' test_create_repo revert && ( cd revert &&
echo 1 >file && git add file && git commit -m first && echo 2 >file && git commit -am second && echo 3 >file && git commit -am third &&
git checkout -b branch &&
git revert --edit HEAD HEAD^ &&
echo 1 >expect && test_cmp expect file ) '
test_expect_success "a variant of Brian's regression for cherry-pick" ' test_create_repo cherry-pick && ( cd cherry-pick &&
echo 1 >file && git add file && git commit -m first && echo 2 >file && git commit -am second && echo 3 >file && git commit -am third &&
git checkout -b branch HEAD^^ &&
git cherry-pick --edit master^ master &&
echo 3 >expect && test_cmp expect file ) '
test_done
--- >8 ---
They both succeed on a47ba3c777's parent, but fail on a47ba3c777 when the 'git revert' or 'git cherry-pick' commands return with exit code 1 after reverting/cherry-picking the first commit instead of processing the second commit:
+ git revert --edit HEAD HEAD^ [branch 88ea48c] Revert "third" Author: A U Thor <author@example.com> 1 file changed, 1 insertion(+), 1 deletion(-) On branch branch Revert currently in progress. nothing to commit, working tree clean error: last command exited with $?=1 not ok 1 - Brian's revert regression
+ git cherry-pick --edit master^ master
[branch 2cb3f74] second
Author: A U Thor <author@example.com>
Date: Sat Nov 23 00:17:32 2019 +0000
1 file changed, 1 insertion(+), 1 deletion(-)
On branch branch
Cherry-pick currently in progress.
nothing to commit, working tree clean
The previous cherry-pick is now empty, possibly due to conflict
resolution.
If you wish to commit it anyway, use:
git commit --allow-empty
If you wish to skip this commit, use:
git reset
Then "git cherry-pick --continue" will resume cherry-picking
the remaining commits.
error: last command exited with $?=1
not ok 2 - a variant of Brian's regression for cherry-pickThese test should probably be squeezed into 't3508-cherry-pick-many-commits.sh', but Friday has just turned into Saturday around here, so that's enough from me for now.
Show 82 quoted lines
> Note that none of this happens with --no-edit; my reverts happen > smoothly, with no extra need for --continue. > > Regards, > Brian > > $ mkdir tmp > $ cd tmp > /tmp$ git init > Initialized empty Git repository in [...]/tmp/.git/ > /tmp$ touch foo > /tmp$ git add foo > /tmp$ echo bar >> foo > /tmp$ git commit -am baz > [master (root-commit) a388f78d9013] baz > 1 file changed, 1 insertion(+) > create mode 100644 foo > /tmp$ echo pow >> foo > /tmp$ git commit -am whizzbang > [master 51753222dd9a] whizzbang > 1 file changed, 1 insertion(+) > /tmp$ echo pop >> foo > /tmp$ git commit -am nothing > [master 7153607b11e0] nothing > 1 file changed, 1 insertion(+) > /tmp$ git revert HEAD HEAD^ > ## EDITOR pops up, as expected > [master 586469974ec2] Revert "nothing" > 1 file changed, 1 deletion(-) > On branch master > Revert currently in progress. > > nothing to commit, working tree clean > ## Unexpected, confusing pause? No prompt to '--continue' > /tmp$ git log --oneline > 586469974ec2 (HEAD -> master) Revert "nothing" > 7153607b11e0 nothing > 51753222dd9a whizzbang > a388f78d9013 baz > /tmp$ git status > On branch master > Revert currently in progress. > (run "git revert --continue" to continue) > (use "git revert --skip" to skip this patch) > (use "git revert --abort" to cancel the revert operation) > > nothing to commit, working tree clean > /tmp$ git revert --continue > ## EDITOR pops up, as expected > [master b8dd23f61d07] Revert "whizzbang" > 1 file changed, 1 deletion(-) > On branch master > Revert currently in progress. > > nothing to commit, working tree clean > ## Unexpected state; both reverts happened, but revert is still in progress? > /tmp$ git log --oneline > b8dd23f61d07 (HEAD -> master) Revert "whizzbang" > 586469974ec2 Revert "nothing" > 7153607b11e0 nothing > 51753222dd9a whizzbang > a388f78d9013 baz > /tmp$ git status > On branch master > Revert currently in progress. > (run "git revert --continue" to continue) > (use "git revert --skip" to skip this patch) > (use "git revert --abort" to cancel the revert operation) > > nothing to commit, working tree clean > ## OK...I'll run it one more time. > /tmp$ git revert --continue > /tmp$ git status > On branch master > nothing to commit, working tree clean > ## *Now* I'm done > /tmp$ git log --oneline > b8dd23f61d07 (HEAD -> master) Revert "whizzbang" > 586469974ec2 Revert "nothing" > 7153607b11e0 nothing > 51753222dd9a whizzbang > a388f78d9013 baz