From torek's answer:
git -c core.editor=true cherry-pick --continue
With Git 2.32 (Q2 2021), tihs is no longer needed.
git cherry-pick
/revert
with or without --[no-]edit
did not spawn the editor as expected (e.g. "revert --no-edit
" after a conflict still asked to edit the message), which has been corrected with Git 2.32 (Q2 2021).
See commit 39edfd5 (31 Mar 2021) by Elijah Newren (newren
).
(Merged by Junio C Hamano -- gitster
-- in commit 82fd285, 08 Apr 2021)
sequencer
: fix edit handling for cherry-pick and revert messages
Reported-by: Renato Botelho
Signed-off-by: Elijah Newren
Reviewed-by: Johannes Schindelin
save_opts()
should save any non-default values.
It was intended to do this, but since most options in struct replay_opts
default to 0, it only saved non-zero values.
Unfortunately, this does not always work for options.edit.
Roughly speaking, options.edit had a default value of 0 for cherry-pick but a default value of 1 for revert.
Make save_opts()
record a value whenever it differs from the default.
options.edit
was also overly simplistic; we had more than two cases.
The behavior that previously existed was as follows:
Non-conflict commits Right after Conflict
Edit iff isatty(0) Edit (ignore isatty(0))
No edit See above
Edit (ignore isatty(0)) See above
(*) See above
(*) Before stopping for conflicts, No edit is the behavior. After
stopping for conflicts, the --no-edit flag is not saved so see
the first two rows.
However, the expected behavior is:
Non-conflict commits Right after Conflict
Edit iff isatty(0) Edit iff isatty(0)
No edit Edit iff isatty(0)
Edit (ignore isatty(0)) Edit (ignore isatty(0))
No edit No edit
In order to get the expected behavior, we need to change options.edit to a tri-state: unspecified, false, or true.
- When specified, we follow what it says.
- When unspecified, we need to check whether the current commit being created is resolving a conflict as well as consulting options.action and
isatty(0)
.
While at it, add a should_edit()
utility function that compresses options.edit
down to a boolean based on the additional information for the non-conflict case.
continue_single_pick()
is the function responsible for resuming after conflict cases, regardless of whether there is one commit being picked or many.
Make this function stop assuming edit behavior in all cases, so that it can correctly handle !isatty(0)
and specific requests to not edit the commit message.