Re: [BUG] 'git rebase -i ---rebase-merges' can leave MERGE_MSG behind
- From
- Phillip Wood <phillip.wood123@gmail.com>
- Date
- Aug 1, 2021, 09:56 UTC
- Message-ID
- <80afcf4f-fc5a-7722-1a4d-c3e1f1de1e09@gmail.com>
- In-Reply-To
- <20210731062322.GB23408@szeder.dev>
On 31/07/2021 07:23, SZEDER Gábor wrote:
Show 13 quoted lines
> Hi,
>
> 'git rebase -i --rebase-merges' leaves a stray '.git/MERGE_MSG' file
> behind after it re-created an unchanged merge commit. The test script
> below demonstrates this issue (it doesn't fail, but look at its
> verbose output to see what the issue and its consequences are).
>
> This issue is as old as --rebase-merges, I see the same output with
> v2.18.0, the first release containing this feature.
>
> I suspect that fixing this is merely a matter of adding a missing
> unlink(".git/MERGE_MSG") to the right place, but I won't dive into the
> sequencer machinery to figure out where that right place might be :)Looking at do_merge() in sequencer.c .git/MERGE_MSG is written before it checks if it can fast-forward. If it does fast-forward then 'git commit' is not run and .git/MERGE_MSG is not removed. I think the best way to fix it would be to move the fast-forward code so it comes before the code that writes .git/MERGE_MSG. That way we'll not write the message if we can fast-forward.
Best Wishes
Phillip
Show 50 quoted lines
> > --- >8 --- > > #!/bin/sh > > test_description='test' > > . ./test-lib.sh > . "$TEST_DIRECTORY"/lib-rebase.sh > > test_expect_success '--rebase-merges leaves MERGE_MSG behind' ' > # A-B-M-D-E-F > # \ / > # C > test_commit A && > test_commit B && > git checkout -b branch HEAD^ && > test_commit C && > git checkout master && > git merge --log branch && > test_commit D && > test_commit E && > test_commit F && > > # Rewrite a commit after the merge: > write_script todo-editor <<-\EOF && > sed -i -e "/^pick .* E$/ s/^pick/edit/" "$1" > EOF > > # No MERGE_MSG present before starting the rebase, good: > test_path_is_missing .git/MERGE_MSG && > > # Start rebasing before the merge, so the sequencer has to > # re-create an identical merge commit. > GIT_EDITOR=./todo-editor git rebase -i --rebase-merges A && > > # Just to make sure that the history so far is unchanged: > test_cmp_rev E HEAD && > > # BUG: now there is a stray MERGE_MSG file: > cat .git/MERGE_MSG && > > # And it interferes with the next "git commit", because its > # content is included in the commit message template: > echo foo >>E.t && > GIT_EDITOR=cat git commit -a > ' > > test_done >