git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH 3/4] merge: apply autostash if fast-forward fails

From
Junio C Hamano <gitster@pobox.com>
Date
Jul 23, 2021, 19:13 UTC
Message-ID
<xmqqo8asn8s4.fsf@gitster.g>
In-Reply-To
<86becf764243f129c980f073127ec3f08fd4477c.1627042470.git.gitgitgadget@gmail.com>
"Philippe Blain via GitGitGadget" <gitgitgadget@gmail.com> writes:
Show 16 quoted lines
> From: Philippe Blain <levraiphilippeblain@gmail.com>
>
> 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.
Show 48 quoted lines
>
> Signed-off-by: Philippe Blain <levraiphilippeblain@gmail.com>
> ---
>  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 &&
Previous: Felipe ContrerasNext: Philippe Blain via GitGitGadget
Message 6 of 11 in “[RFC] merge --autostash: apply autostash in more cases”
  1. 0/4 [RFC] merge --autostash: apply autostash in more casesPhilippe Blain via GitGitGadget, Jul 23, 2021
  2. 1/4 merge: add missing word "strategy" to a messagePhilippe Blain via GitGitGadget, Jul 23, 2021
  3. Felipe ContrerasJul 23, 2021
  4. 3/4 merge: apply autostash if fast-forward failsPhilippe Blain via GitGitGadget, Jul 23, 2021
  5. Felipe ContrerasJul 23, 2021
  6. Junio C HamanoJul 23, 2021
  7. 2/4 Documentation: define 'MERGE_AUTOSTASH'Philippe Blain via GitGitGadget, Jul 23, 2021
  8. Felipe ContrerasJul 23, 2021
  9. 4/4 merge: apply autostash if merge strategy failsPhilippe Blain via GitGitGadget, Jul 23, 2021
  10. Junio C HamanoJul 23, 2021
  11. Felipe ContrerasJul 23, 2021

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.