I was burned a few times with this in the past few years, but it did
not irritate me often enough that I didn't write it down. But I
think this is serious enough that deserves attention from those who
were involved.
A short reproduction recipe, using objects from git.git that are
publicly available and stable, shows how bad it is.
$ git checkout v2.9.3^0
$ git cherry-pick 0582a34f52..a94bb68397
... see conflict, decide to give up backporting to
... such an old fork point.
... the git-prompt gives "|CHERRY-PICKING" correctly.
$ git reset --hard v2.10.2^0
... the git-prompt no longer says "|CHERRY-PICKING"
$ edit && git commit -m "prelim work for backporting"
[detached HEAD cc5a6a9219] prelim work for backporting
$ git cherry-pick 0582a34f52..a94bb68397
error: a cherry-pick or revert is already in progress
hint: try "git cherry-pick (--continue | --quit | --abort)"
fatal: cherry-pick failed
$ git cherry-pick --abort
... we come back to v2.9.3^0, losing the new commit!
The above shows two bugs.
(1) The third invocation of "cherry-pick" with "--abort" to get rid
of the state from the unfinished cherry-pick we did previously
is necessary, but the command does not notice that we resetted
to a new branch AND we even did some other work there. This
loses end-user's work.
"git cherry-pick --abort" should learn from "git am --abort"
that has an extra safety to deal with the above workflow. The
state from the unfinished "am" is removed, but the head is not
rewound to avoid losing end-user's work.
You can try by replacing two instances of
$ git cherry-pick 0582a34f52..a94bb68397
with
$ git format-patch --stdout 0582a34f52..a94bb68397 | git am
in the above sequence, and conclude with "git am--abort" to see
how much more pleasant and safe "git am --abort" is.
(2) The bug in "cherry-pick --abort" is made worse because the
git-completion script seems to be unaware of $GIT_DIR/sequencer
and stops saying "|CHERRY-PICKING" after the step to switch to
a different state with "git reset --hard v2.10.2^0". If the
prompt showed it after "git reset", the end user would have
thought twice before starting the "prelim work".
Thanks.