"Philippe Blain via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > From: Philippe Blain <levraiphilippeblain@xxxxxxxxx> > > Since 'git merge' learned '--autostash' in a03b55530a (merge: teach > --autostash option, 2020-04-07), 'cmd_merge', in the fast-forward case, > calls 'create_autostash' before calling 'checkout_fast_forward' if > '--autostash' is given. > > However, if 'checkout_fast_forward' fails, the autostash is not applied > to the working tree, nor saved in the stash list, since the code simply > calls 'goto done'. > > Be more helpful to the user by applying the autostash in that case. > > An easy way to test a failing fast-forward is when we are merging a > branch that has a tracked file that conflicts with an untracked file in > the working tree. I think this one makes sense, as the case that is tested I know fast-forward (aka two-tree switching) would be atomic. If your working tree is already broken (e.g. triggers I/O errors in the middle, some directories having wrong permissions to make them unwritable by you, etc.), you would also see an error from fast-forward and you probably cannot tell these two cases apart, and trying to unstash the local changes may make things even worse, but I suspect that there isn't much you can do about it. Thanks. > > Signed-off-by: Philippe Blain <levraiphilippeblain@xxxxxxxxx> > --- > builtin/merge.c | 1 + > t/t7600-merge.sh | 11 +++++++++++ > 2 files changed, 12 insertions(+) > > diff --git a/builtin/merge.c b/builtin/merge.c > index 74797b6c7a6..788a6b0cd55 100644 > --- a/builtin/merge.c > +++ b/builtin/merge.c > @@ -1560,6 +1560,7 @@ int cmd_merge(int argc, const char **argv, const char *prefix) > &head_commit->object.oid, > &commit->object.oid, > overwrite_ignore)) { > + apply_autostash(git_path_merge_autostash(the_repository)); > ret = 1; > goto done; > } > diff --git a/t/t7600-merge.sh b/t/t7600-merge.sh > index 1cbc9715a81..216113d3537 100755 > --- a/t/t7600-merge.sh > +++ b/t/t7600-merge.sh > @@ -122,6 +122,8 @@ test_expect_success 'setup' ' > c0=$(git rev-parse HEAD) && > cp file.1 file && > git add file && > + cp file.1 other && > + git add other && > test_tick && > git commit -m "commit 1" && > git tag c1 && > @@ -711,6 +713,15 @@ test_expect_success 'fast-forward merge with --autostash' ' > test_cmp result.1-5 file > ' > > +test_expect_success 'failed fast-forward merge with --autostash' ' > + git reset --hard c0 && > + git merge-file file file.orig file.5 && > + cp file.5 other && > + test_must_fail git merge --autostash c1 2>err && > + test_i18ngrep "Applied autostash." err && > + test_cmp file.5 file > +' > + > test_expect_success 'octopus merge with --autostash' ' > git reset --hard c1 && > git merge-file file file.orig file.3 &&