"Phillip Wood via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > When rebasing commands are moved from the todo list in "git-rebase-todo" > to the "done" file (which is used by "git status" to show the recently > executed commands) just before they are executed. This means that if a > command fails because it would overwrite an untracked file it has to be > added back into the todo list before the rebase stops for the user to > fix the problem. > > Unfortunately when a failed command is added back into the todo list > the command preceding it is erroneously appended to the "done" file. > This means that when rebase stops after "pick B" fails the "done" > file contains > > pick A > pick B > pick A > > instead of > > pick A > pick B It's very interesting that an _earlier_ line would get appended on the _other_ side, I'd expect that even if lines get duplicated, their relative order would be preserved. I was not able to trace the sequence of events that got us here, so I could not make a connection from that to the solution. I didn't dig deeply into this patch either, so I will refrain from commenting on the solution. > diff --git a/t/t3404-rebase-interactive.sh b/t/t3404-rebase-interactive.sh > index a657167befd..653c19bc9c8 100755 > --- a/t/t3404-rebase-interactive.sh > +++ b/t/t3404-rebase-interactive.sh > @@ -1276,18 +1276,23 @@ test_expect_success 'todo count' ' > ' > > test_expect_success 'rebase -i commits that overwrite untracked files (pick)' ' > - git checkout --force branch2 && > + git checkout --force A && > git clean -f && > + cat >todo <<-EOF && > + exec >file2 > + pick $(git rev-parse B) B > + pick $(git rev-parse C) C > + pick $(git rev-parse D) D > + exec cat .git/rebase-merge/done >actual > + EOF > ( > - set_fake_editor && > - FAKE_LINES="edit 1 2" git rebase -i A > + set_replace_editor todo && > + test_must_fail git rebase -i A > ) && > - test_cmp_rev HEAD F && > - test_path_is_missing file6 && > - >file6 && > - test_must_fail git rebase --continue && > - test_cmp_rev HEAD F && > - rm file6 && > + test_cmp_rev HEAD B && > + head -n3 todo >expect && > + test_cmp expect .git/rebase-merge/done && > + rm file2 && I didn't look into how the test works, but I confirmed that it tests the exact scenario described in the commit message.