From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-13 13:07:37
This is a collection of merge related fixes for rebase -r
* Make merge -c behave like reword.
* When fast-forwarding a merge don't leave .git/MERGE_MSG around (reported
by Gábor)
* Make merge -c work when with --strategy
Phillip Wood (4):
rebase -r: make 'merge -c' behave like reword
rebase -i: Add another reword test
rebase -r: don't write .git/MERGE_MSG when fast-forwarding
rebase -r: fix merge -c with a merge strategy
sequencer.c | 106 ++++++++++++++++++----------------
t/lib-rebase.sh | 56 ++++++++++++++++++
t/t3404-rebase-interactive.sh | 13 +++++
t/t3430-rebase-merges.sh | 38 +++++++++---
4 files changed, 155 insertions(+), 58 deletions(-)
base-commit: 66262451ec94d30ac4b80eb3123549cf7a788afd
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1015%2Fphillipwood%2Fwip%2Fsequencer-merge-c-v1
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1015/phillipwood/wip/sequencer-merge-c-v1
Pull-Request: https://github.com/gitgitgadget/git/pull/1015
--
gitgitgadget
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-13 13:07:38
From: Phillip Wood <redacted>
If the user runs git log while rewording a commit it is confusing if
sometimes we're amending the commit that's being reworded and at other
times we're creating a new commit depending on whether we could
fast-forward or not[1]. For this reason the reword command ensures
that there are no uncommitted changes when rewording. The reword
command also allows the user to edit the todo list while the rebase is
paused. As 'merge -c' also rewords commits make it behave like reword
and add a test.
[1] https://lore.kernel.org/git/xmqqlfvu4be3.fsf@gitster-ct.c.googlers.com/T/#m133009cb91cf0917bcf667300f061178be56680a
Signed-off-by: Phillip Wood <redacted>
---
sequencer.c | 24 +++++++++++--------
t/lib-rebase.sh | 50 ++++++++++++++++++++++++++++++++++++++++
t/t3430-rebase-merges.sh | 20 ++++++++--------
3 files changed, 75 insertions(+), 19 deletions(-)
@@ -151,3 +151,53 @@ test_editor_unchanged () {EOFtest_cmpexpectactual}++# Set up an editor for testing reword commands+# Checks that there are no uncommitted changes when rewording and that the+# todo-list is reread after each+set_reword_editor(){+>reword-actual&&+>reword-oid&&++# Check rewording keeps the original authorship+GIT_AUTHOR_NAME="Reword Author"+GIT_AUTHOR_EMAIL="reword.author@example.com"+GIT_AUTHOR_DATE=@123456++write_scriptreword-sequence-editor.sh<<-\EOF&&+todo="$(cat"$1")"&&+echo"exec git log -1 --pretty=format:'%an <%ae> %at%n%B%n' \+>>reword-actual" >"$1" &&+printf"%s\n""$todo">>"$1"+EOF++write_scriptreword-editor.sh<<-EOF&&+# Save the oid of the first reworded commit so we can check rebase+# fast-forwards to it+if!test-sreword-oid+then+gitrev-parseHEAD>reword-oid+fi&&+# There should be no uncommited changes+gitdiff--exit-codeHEAD&&+# The todo-list should be re-read after a reword+GIT_SEQUENCE_EDITOR="\"$PWD/reword-sequence-editor.sh\""\+gitrebase--edit-todo&&+echoedited>>"\$1"+EOF++test_set_editor"$PWD/reword-editor.sh"+}++# Check the results of a rebase after calling set_reword_editor+# Pass the commits that were reworded in the order that they were picked+# Expects the first pick to be a fast-forward+check_reworded_commits(){+test_cmp_rev"$(catreword-oid)""$1^{commit}"&&+gitlog--format="%an <%ae> %at%n%B%nedited%n"--no-walk=unsorted"$@"\+>reword-expected&&+test_cmpreword-expectedreword-actual&&+gitlog--format="%an <%ae> %at%n%B"-n$#--first-parent--reverse\+>reword-log&&+test_cmpreword-expectedreword-log+}
@@ -172,17 +172,19 @@ test_expect_success 'failed `merge <branch>` does not crash' 'grep"^Merge branch ${SQ}G${SQ}$".git/rebase-merge/message'-test_expect_success'fast-forward merge -c still rewords''-gitcheckout-bfast-forward-merge-cH&&+test_expect_success'merge -c commits before rewording and reloads todo-list''+cat>script-from-scratch<<-\EOF&&+merge-cEB+merge-cHG+EOF++gitcheckout-bmerge-cH&&(-set_fake_editor&&-FAKE_COMMIT_MESSAGE=edited\-GIT_SEQUENCE_EDITOR="echo merge -c H G >"\-gitrebase-ir@^+set_reword_editor&&+GIT_SEQUENCE_EDITOR="\"$PWD/replace-editor.sh\""\+gitrebase-i-rD)&&-echoedited>expected&&-gitlog--pretty=format:%B-1>actual&&-test_cmpexpectedactual+check_reworded_commitsEH' test_expect_success'with a branch tip that was cherry-picked already''
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-13 13:07:40
From: Phillip Wood <redacted>
None of the existing reword tests check that there are no uncommitted
changes when the editor is opened. Reuse the editor script from the
last commit to fix this omission.
Signed-off-by: Phillip Wood <redacted>
---
t/t3404-rebase-interactive.sh | 13 +++++++++++++
1 file changed, 13 insertions(+)
@@ -839,6 +839,19 @@ test_expect_success 'reword' 'gitshowHEAD~2|grep"C changed"'+test_expect_success'no uncommited changes when rewording the todo list is reloaded''+gitcheckoutE&&+test_when_finished"git checkout @{-1}"&&+(+set_fake_editor&&+GIT_SEQUENCE_EDITOR="\"$PWD/fake-editor.sh\""&&+exportGIT_SEQUENCE_EDITOR&&+set_reword_editor&&+FAKE_LINES="reword 1 reword 2"gitrebase-iC+)&&+check_reworded_commitsDE+'+ test_expect_success'rebase -i can copy notes''gitconfignotes.rewrite.rebasetrue&&gitconfignotes.rewriteRef"refs/notes/*"&&
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-13 13:07:43
From: Phillip Wood <redacted>
When fast-forwarding we do not create a new commit so .git/MERGE_MSG
is not removed and can end up seeding the message of a commit made
after the rebase has finished. Avoid writing .git/MERGE_MSG when we
are fast-forwarding by writing the file after the fast-forward
checks.
Note that the way this change is implemented means we no longer write
the author script when fast-forwarding either. I believe this is safe
for the reasons below but it is a departure from what we do when
fast-forwarding a non-merge commit. If we reword the merge then 'git
commit --amend' will keep the authorship of the commit we're rewording
as it ignores GIT_AUTHOR_* unless --reset-author is passed. It will
also export the correct GIT_AUTHOR_* variables to any hooks and we
already test the authorship of the reworded commit. If we are not
rewording then we no longer call spilt_ident() which means we are no
longer checking the commit author header looks sane. However this is
what we already do when fast-forwarding non-merge commits in
skip_unnecessary_picks() so I don't think we're breaking any promises
by not checking the author here.
Reported-by: SZEDER Gábor <redacted>
Signed-off-by: Phillip Wood <redacted>
---
sequencer.c | 81 +++++++++++++++++++++++++------------------------
t/lib-rebase.sh | 10 ++++--
2 files changed, 49 insertions(+), 42 deletions(-)
@@ -173,10 +173,16 @@ set_reword_editor () {write_scriptreword-editor.sh<<-EOF&&# Save the oid of the first reworded commit so we can check rebase-# fast-forwards to it+# fast-forwards to it. Also check that we do not write .git/MERGE_MSG+# when fast-forwardingif!test-sreword-oidthen-gitrev-parseHEAD>reword-oid+gitrev-parseHEAD>reword-oid&&+iftest-f.git/MERGE_MSG+then+echo1>&2"error: .git/MERGE_MSG exists"+exit1+fifi&&# There should be no uncommited changesgitdiff--exit-codeHEAD&&
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-13 13:07:44
From: Phillip Wood <redacted>
If a rebase is started with a --strategy option other than "ort" or
"recursive" then "merge -c" does not allow the user to reword the
commit message.
Signed-off-by: Phillip Wood <redacted>
---
sequencer.c | 5 ++++-
t/t3430-rebase-merges.sh | 18 ++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
@@ -187,6 +187,24 @@ test_expect_success 'merge -c commits before rewording and reloads todo-list' 'check_reworded_commitsEH'+test_expect_success'merge -c rewords when a strategy is given''+gitcheckout-bmerge-c-with-strategyH&&+write_scriptgit-merge-override<<-\EOF&&+echooverridden$1>G.t+gitaddG.t+EOF++PATH="$PWD:$PATH"\+GIT_SEQUENCE_EDITOR="echo merge -c H G >"\+GIT_EDITOR="echo edited >>"\+gitrebase--no-ff-ir-soverride-XxoptE&&+test_write_linesoverridden--xopt>expect&&+test_cmpexpectG.t&&+test_write_linesH""edited"">expect&&+gitlog--format=%B-1>actual&&+test_cmpexpectactual++' test_expect_success'with a branch tip that was cherry-picked already''gitcheckout-balready-upstreammain&&base="$(gitrev-parse--verifyHEAD)"&&
From: Johannes Schindelin <hidden> Date: 2021-08-14 22:43:30
Hi Phillip,
On Fri, 13 Aug 2021, Phillip Wood via GitGitGadget wrote:
This is a collection of merge related fixes for rebase -r
* Make merge -c behave like reword.
* When fast-forwarding a merge don't leave .git/MERGE_MSG around (reported
by Gábor)
* Make merge -c work when with --strategy
Phillip Wood (4):
rebase -r: make 'merge -c' behave like reword
rebase -i: Add another reword test
rebase -r: don't write .git/MERGE_MSG when fast-forwarding
rebase -r: fix merge -c with a merge strategy
I reviewed all four patches (the first one took the most time, obviously)
and it was quite the pleasant read. I am in favor of integrating them
as-are.
Thank you,
Dscho
From: SZEDER Gábor <hidden> Date: 2021-08-17 17:26:15
On Fri, Aug 13, 2021 at 01:07:32PM +0000, Phillip Wood via GitGitGadget wrote:
From: Phillip Wood <redacted>
When fast-forwarding we do not create a new commit so .git/MERGE_MSG
is not removed and can end up seeding the message of a commit made
after the rebase has finished. Avoid writing .git/MERGE_MSG when we
are fast-forwarding by writing the file after the fast-forward
checks.
Note that the way this change is implemented means we no longer write
the author script when fast-forwarding either. I believe this is safe
for the reasons below but it is a departure from what we do when
fast-forwarding a non-merge commit. If we reword the merge then 'git
commit --amend' will keep the authorship of the commit we're rewording
as it ignores GIT_AUTHOR_* unless --reset-author is passed. It will
also export the correct GIT_AUTHOR_* variables to any hooks and we
already test the authorship of the reworded commit. If we are not
rewording then we no longer call spilt_ident() which means we are no
longer checking the commit author header looks sane. However this is
what we already do when fast-forwarding non-merge commits in
skip_unnecessary_picks() so I don't think we're breaking any promises
by not checking the author here.
Thanks you for fixing this bug.
FWIW (not that much, I'm afraid), I think your reasoning about the
harmlessness of the behavior change concerning the author script makes
sense.
My only nit is that the movement of a ~40 lines block of code makes
out the bulk of the patch; perhaps it would be worth mentioning it
explicitly in the commit message, so future readers of this commit
won't look for changes in those hunks.
@@ -173,10 +173,16 @@ set_reword_editor () {write_scriptreword-editor.sh<<-EOF&&# Save the oid of the first reworded commit so we can check rebase-# fast-forwards to it+# fast-forwards to it. Also check that we do not write .git/MERGE_MSG+# when fast-forwardingif!test-sreword-oidthen-gitrev-parseHEAD>reword-oid+gitrev-parseHEAD>reword-oid&&+iftest-f.git/MERGE_MSG+then+echo1>&2"error: .git/MERGE_MSG exists"+exit1+fifi&&# There should be no uncommited changesgitdiff--exit-codeHEAD&&
Hi Dscho
On 14/08/2021 23:43, Johannes Schindelin wrote:
Hi Phillip,
On Fri, 13 Aug 2021, Phillip Wood via GitGitGadget wrote:
quoted
This is a collection of merge related fixes for rebase -r
* Make merge -c behave like reword.
* When fast-forwarding a merge don't leave .git/MERGE_MSG around (reported
by Gábor)
* Make merge -c work when with --strategy
Phillip Wood (4):
rebase -r: make 'merge -c' behave like reword
rebase -i: Add another reword test
rebase -r: don't write .git/MERGE_MSG when fast-forwarding
rebase -r: fix merge -c with a merge strategy
I reviewed all four patches (the first one took the most time, obviously)
and it was quite the pleasant read. I am in favor of integrating them
as-are.
On Fri, Aug 13, 2021 at 01:07:32PM +0000, Phillip Wood via GitGitGadget wrote:
quoted
From: Phillip Wood <redacted>
When fast-forwarding we do not create a new commit so .git/MERGE_MSG
is not removed and can end up seeding the message of a commit made
after the rebase has finished. Avoid writing .git/MERGE_MSG when we
are fast-forwarding by writing the file after the fast-forward
checks.
Note that the way this change is implemented means we no longer write
the author script when fast-forwarding either. I believe this is safe
for the reasons below but it is a departure from what we do when
fast-forwarding a non-merge commit. If we reword the merge then 'git
commit --amend' will keep the authorship of the commit we're rewording
as it ignores GIT_AUTHOR_* unless --reset-author is passed. It will
also export the correct GIT_AUTHOR_* variables to any hooks and we
already test the authorship of the reworded commit. If we are not
rewording then we no longer call spilt_ident() which means we are no
longer checking the commit author header looks sane. However this is
what we already do when fast-forwarding non-merge commits in
skip_unnecessary_picks() so I don't think we're breaking any promises
by not checking the author here.
Thanks you for fixing this bug.
FWIW (not that much, I'm afraid), I think your reasoning about the
harmlessness of the behavior change concerning the author script makes
sense.
My only nit is that the movement of a ~40 lines block of code makes
out the bulk of the patch; perhaps it would be worth mentioning it
explicitly in the commit message, so future readers of this commit
won't look for changes in those hunks.
Thanks for reading through the patch, I take your point about the code
movement and will add a comment (I have --color-moved turned on by
default and tend to forget others may not)
Best Wishes
Phillip
@@ -173,10 +173,16 @@ set_reword_editor () {write_scriptreword-editor.sh<<-EOF&&# Save the oid of the first reworded commit so we can check rebase-# fast-forwards to it+# fast-forwards to it. Also check that we do not write .git/MERGE_MSG+# when fast-forwardingif!test-sreword-oidthen-gitrev-parseHEAD>reword-oid+gitrev-parseHEAD>reword-oid&&+iftest-f.git/MERGE_MSG+then+echo1>&2"error: .git/MERGE_MSG exists"+exit1+fifi&&# There should be no uncommited changesgitdiff--exit-codeHEAD&&
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-20 15:40:43
Thanks for the feedback on V1. I have added a sentence to the commit message
of the third patch to make it clear that the fast-forward code is just
moved, not changed
Cover letter from V1: This is a collection of merge related fixes for rebase
-r
* Make merge -c behave like reword.
* When fast-forwarding a merge don't leave .git/MERGE_MSG around (reported
by Gábor)
* Make merge -c work when with --strategy
Phillip Wood (4):
rebase -r: make 'merge -c' behave like reword
rebase -i: Add another reword test
rebase -r: don't write .git/MERGE_MSG when fast-forwarding
rebase -r: fix merge -c with a merge strategy
sequencer.c | 106 ++++++++++++++++++----------------
t/lib-rebase.sh | 56 ++++++++++++++++++
t/t3404-rebase-interactive.sh | 13 +++++
t/t3430-rebase-merges.sh | 38 +++++++++---
4 files changed, 155 insertions(+), 58 deletions(-)
base-commit: 66262451ec94d30ac4b80eb3123549cf7a788afd
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1015%2Fphillipwood%2Fwip%2Fsequencer-merge-c-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1015/phillipwood/wip/sequencer-merge-c-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1015
Range-diff vs v1:
1: b514dbdf928 = 1: b514dbdf928 rebase -r: make 'merge -c' behave like reword
2: 511cf9204ad = 2: 511cf9204ad rebase -i: Add another reword test
3: 01d5ed4cba0 ! 3: 080e580e11c rebase -r: don't write .git/MERGE_MSG when fast-forwarding
@@ Commit message
is not removed and can end up seeding the message of a commit made
after the rebase has finished. Avoid writing .git/MERGE_MSG when we
are fast-forwarding by writing the file after the fast-forward
- checks.
+ checks. Note that there are no changes to the fast-forward code, it is
+ simply moved.
Note that the way this change is implemented means we no longer write
the author script when fast-forwarding either. I believe this is safe
4: f2a2e3531a1 = 4: b6981ea5439 rebase -r: fix merge -c with a merge strategy
--
gitgitgadget
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-20 15:40:45
From: Phillip Wood <redacted>
If the user runs git log while rewording a commit it is confusing if
sometimes we're amending the commit that's being reworded and at other
times we're creating a new commit depending on whether we could
fast-forward or not[1]. For this reason the reword command ensures
that there are no uncommitted changes when rewording. The reword
command also allows the user to edit the todo list while the rebase is
paused. As 'merge -c' also rewords commits make it behave like reword
and add a test.
[1] https://lore.kernel.org/git/xmqqlfvu4be3.fsf@gitster-ct.c.googlers.com/T/#m133009cb91cf0917bcf667300f061178be56680a
Signed-off-by: Phillip Wood <redacted>
---
sequencer.c | 24 +++++++++++--------
t/lib-rebase.sh | 50 ++++++++++++++++++++++++++++++++++++++++
t/t3430-rebase-merges.sh | 20 ++++++++--------
3 files changed, 75 insertions(+), 19 deletions(-)
@@ -151,3 +151,53 @@ test_editor_unchanged () {EOFtest_cmpexpectactual}++# Set up an editor for testing reword commands+# Checks that there are no uncommitted changes when rewording and that the+# todo-list is reread after each+set_reword_editor(){+>reword-actual&&+>reword-oid&&++# Check rewording keeps the original authorship+GIT_AUTHOR_NAME="Reword Author"+GIT_AUTHOR_EMAIL="reword.author@example.com"+GIT_AUTHOR_DATE=@123456++write_scriptreword-sequence-editor.sh<<-\EOF&&+todo="$(cat"$1")"&&+echo"exec git log -1 --pretty=format:'%an <%ae> %at%n%B%n' \+>>reword-actual" >"$1" &&+printf"%s\n""$todo">>"$1"+EOF++write_scriptreword-editor.sh<<-EOF&&+# Save the oid of the first reworded commit so we can check rebase+# fast-forwards to it+if!test-sreword-oid+then+gitrev-parseHEAD>reword-oid+fi&&+# There should be no uncommited changes+gitdiff--exit-codeHEAD&&+# The todo-list should be re-read after a reword+GIT_SEQUENCE_EDITOR="\"$PWD/reword-sequence-editor.sh\""\+gitrebase--edit-todo&&+echoedited>>"\$1"+EOF++test_set_editor"$PWD/reword-editor.sh"+}++# Check the results of a rebase after calling set_reword_editor+# Pass the commits that were reworded in the order that they were picked+# Expects the first pick to be a fast-forward+check_reworded_commits(){+test_cmp_rev"$(catreword-oid)""$1^{commit}"&&+gitlog--format="%an <%ae> %at%n%B%nedited%n"--no-walk=unsorted"$@"\+>reword-expected&&+test_cmpreword-expectedreword-actual&&+gitlog--format="%an <%ae> %at%n%B"-n$#--first-parent--reverse\+>reword-log&&+test_cmpreword-expectedreword-log+}
@@ -172,17 +172,19 @@ test_expect_success 'failed `merge <branch>` does not crash' 'grep"^Merge branch ${SQ}G${SQ}$".git/rebase-merge/message'-test_expect_success'fast-forward merge -c still rewords''-gitcheckout-bfast-forward-merge-cH&&+test_expect_success'merge -c commits before rewording and reloads todo-list''+cat>script-from-scratch<<-\EOF&&+merge-cEB+merge-cHG+EOF++gitcheckout-bmerge-cH&&(-set_fake_editor&&-FAKE_COMMIT_MESSAGE=edited\-GIT_SEQUENCE_EDITOR="echo merge -c H G >"\-gitrebase-ir@^+set_reword_editor&&+GIT_SEQUENCE_EDITOR="\"$PWD/replace-editor.sh\""\+gitrebase-i-rD)&&-echoedited>expected&&-gitlog--pretty=format:%B-1>actual&&-test_cmpexpectedactual+check_reworded_commitsEH' test_expect_success'with a branch tip that was cherry-picked already''
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-20 15:40:49
From: Phillip Wood <redacted>
None of the existing reword tests check that there are no uncommitted
changes when the editor is opened. Reuse the editor script from the
last commit to fix this omission.
Signed-off-by: Phillip Wood <redacted>
---
t/t3404-rebase-interactive.sh | 13 +++++++++++++
1 file changed, 13 insertions(+)
@@ -839,6 +839,19 @@ test_expect_success 'reword' 'gitshowHEAD~2|grep"C changed"'+test_expect_success'no uncommited changes when rewording the todo list is reloaded''+gitcheckoutE&&+test_when_finished"git checkout @{-1}"&&+(+set_fake_editor&&+GIT_SEQUENCE_EDITOR="\"$PWD/fake-editor.sh\""&&+exportGIT_SEQUENCE_EDITOR&&+set_reword_editor&&+FAKE_LINES="reword 1 reword 2"gitrebase-iC+)&&+check_reworded_commitsDE+'+ test_expect_success'rebase -i can copy notes''gitconfignotes.rewrite.rebasetrue&&gitconfignotes.rewriteRef"refs/notes/*"&&
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-20 15:40:50
From: Phillip Wood <redacted>
When fast-forwarding we do not create a new commit so .git/MERGE_MSG
is not removed and can end up seeding the message of a commit made
after the rebase has finished. Avoid writing .git/MERGE_MSG when we
are fast-forwarding by writing the file after the fast-forward
checks. Note that there are no changes to the fast-forward code, it is
simply moved.
Note that the way this change is implemented means we no longer write
the author script when fast-forwarding either. I believe this is safe
for the reasons below but it is a departure from what we do when
fast-forwarding a non-merge commit. If we reword the merge then 'git
commit --amend' will keep the authorship of the commit we're rewording
as it ignores GIT_AUTHOR_* unless --reset-author is passed. It will
also export the correct GIT_AUTHOR_* variables to any hooks and we
already test the authorship of the reworded commit. If we are not
rewording then we no longer call spilt_ident() which means we are no
longer checking the commit author header looks sane. However this is
what we already do when fast-forwarding non-merge commits in
skip_unnecessary_picks() so I don't think we're breaking any promises
by not checking the author here.
Reported-by: SZEDER Gábor <redacted>
Signed-off-by: Phillip Wood <redacted>
---
sequencer.c | 81 +++++++++++++++++++++++++------------------------
t/lib-rebase.sh | 10 ++++--
2 files changed, 49 insertions(+), 42 deletions(-)
@@ -173,10 +173,16 @@ set_reword_editor () {write_scriptreword-editor.sh<<-EOF&&# Save the oid of the first reworded commit so we can check rebase-# fast-forwards to it+# fast-forwards to it. Also check that we do not write .git/MERGE_MSG+# when fast-forwardingif!test-sreword-oidthen-gitrev-parseHEAD>reword-oid+gitrev-parseHEAD>reword-oid&&+iftest-f.git/MERGE_MSG+then+echo1>&2"error: .git/MERGE_MSG exists"+exit1+fifi&&# There should be no uncommited changesgitdiff--exit-codeHEAD&&
From: Phillip Wood via GitGitGadget <hidden> Date: 2021-08-20 15:40:50
From: Phillip Wood <redacted>
If a rebase is started with a --strategy option other than "ort" or
"recursive" then "merge -c" does not allow the user to reword the
commit message.
Signed-off-by: Phillip Wood <redacted>
---
sequencer.c | 5 ++++-
t/t3430-rebase-merges.sh | 18 ++++++++++++++++++
2 files changed, 22 insertions(+), 1 deletion(-)
@@ -187,6 +187,24 @@ test_expect_success 'merge -c commits before rewording and reloads todo-list' 'check_reworded_commitsEH'+test_expect_success'merge -c rewords when a strategy is given''+gitcheckout-bmerge-c-with-strategyH&&+write_scriptgit-merge-override<<-\EOF&&+echooverridden$1>G.t+gitaddG.t+EOF++PATH="$PWD:$PATH"\+GIT_SEQUENCE_EDITOR="echo merge -c H G >"\+GIT_EDITOR="echo edited >>"\+gitrebase--no-ff-ir-soverride-XxoptE&&+test_write_linesoverridden--xopt>expect&&+test_cmpexpectG.t&&+test_write_linesH""edited"">expect&&+gitlog--format=%B-1>actual&&+test_cmpexpectactual++' test_expect_success'with a branch tip that was cherry-picked already''gitcheckout-balready-upstreammain&&base="$(gitrev-parse--verifyHEAD)"&&
From: Johannes Schindelin <hidden> Date: 2021-08-24 13:34:05
Hi Phillip,
On Fri, 20 Aug 2021, Phillip Wood via GitGitGadget wrote:
Thanks for the feedback on V1. I have added a sentence to the commit message
of the third patch to make it clear that the fast-forward code is just
moved, not changed
Cover letter from V1: This is a collection of merge related fixes for rebase
-r
* Make merge -c behave like reword.
* When fast-forwarding a merge don't leave .git/MERGE_MSG around (reported
by Gábor)
* Make merge -c work when with --strategy
Phillip Wood (4):
rebase -r: make 'merge -c' behave like reword
rebase -i: Add another reword test
rebase -r: don't write .git/MERGE_MSG when fast-forwarding
rebase -r: fix merge -c with a merge strategy
sequencer.c | 106 ++++++++++++++++++----------------
t/lib-rebase.sh | 56 ++++++++++++++++++
t/t3404-rebase-interactive.sh | 13 +++++
t/t3430-rebase-merges.sh | 38 +++++++++---
4 files changed, 155 insertions(+), 58 deletions(-)
base-commit: 66262451ec94d30ac4b80eb3123549cf7a788afd
Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-1015%2Fphillipwood%2Fwip%2Fsequencer-merge-c-v2
Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-1015/phillipwood/wip/sequencer-merge-c-v2
Pull-Request: https://github.com/gitgitgadget/git/pull/1015
Range-diff vs v1:
1: b514dbdf928 = 1: b514dbdf928 rebase -r: make 'merge -c' behave like reword
2: 511cf9204ad = 2: 511cf9204ad rebase -i: Add another reword test
3: 01d5ed4cba0 ! 3: 080e580e11c rebase -r: don't write .git/MERGE_MSG when fast-forwarding
@@ Commit message
is not removed and can end up seeding the message of a commit made
after the rebase has finished. Avoid writing .git/MERGE_MSG when we
are fast-forwarding by writing the file after the fast-forward
- checks.
+ checks. Note that there are no changes to the fast-forward code, it is
+ simply moved.
The result still looks fine to me.
Thank you,
Dscho
Note that the way this change is implemented means we no longer write
the author script when fast-forwarding either. I believe this is safe
4: f2a2e3531a1 = 4: b6981ea5439 rebase -r: fix merge -c with a merge strategy
--
gitgitgadget