From: Phillip Wood Date: Sun, 01 Aug 2021 09:56:17 GMT Subject: Re: [BUG] 'git rebase -i ---rebase-merges' can leave MERGE_MSG behind 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: > 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 > > --- >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 >