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

Re: [PATCH v2 3/8] checkout: validate stage and merge option compatibility in checkout_paths()

From
Karthik Nayak <karthik.188@gmail.com>
Date
Sep 2, 2026, 11:20 UTC
Message-ID
<CAOLa=ZSQs5umaTxT6RKQJdnnAEbK+AHgj0n5yiTM0jsbZcyiig@mail.gmail.com>
In-Reply-To
<xmqqld9ksw26.fsf@gitster.g>
Junio C Hamano <gitster@pobox.com> writes:
Show 32 quoted lines
> Karthik Nayak <karthik.188@gmail.com> writes:
>
>>> @@ -591,6 +591,10 @@ static int checkout_paths(const struct checkout_opts *opts,
>>>  		die(_("'%s', '%s', or '%s' cannot be used when checking out of a tree"),
>>>  		    "--merge", "--ours", "--theirs");
>>>
>>> +	if (1 < !!opts->writeout_stage + !!opts->force + !!opts->merge)
>>> +		die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
>>> +		      "checking out of the index."));
>>> +
>>
>> Doesn't checkout_paths() also get triggered when using '--patch',
>> shouldn't this go below...
>>
>>>  	if (opts->patch_mode) {
>>>  		enum add_p_mode patch_mode;
>>>  		struct interactive_options interactive_opts = {
>>>
>>
>> ...this block? As the original checked for `opts->patchspec.nr`
>
> Sorry, I do not quite understand your question.
>
> The "if (opts->patch_mode)" block indeed appears in checkout_paths()
> and when "--patch" is given the control comes here.  Are you worried
> about
>
>     git restore --patch --merge --theirs
>
> triggering the option compatibility check, instead of ignoring it
> and directly jumping into the patch mode?
>

Sorry if I was unclear. I was stating that the condition udner which the check runs is now difference. Previously we checked `opts->pathspec.nr`, but now `checkout_paths()` is also entered for '--patch' without any path spec.

Having a closer look, it seems to be okay. Because in patch mode, each of the combinations is already rejected before in `checkout_paths()`.

It still might be good to have a sentence in a the commit message, since the guard did change and the reasoning why that is safe is not so obvious.

This does however change the precedence of the error messages:
  $ git.master restore --staged --theirs --merge foo
  fatal: git checkout: --ours/--theirs, --force and --merge are
  incompatible when checking out of the index.
  $ git.patch restore --staged --theirs --merge foo
  fatal: '--ours' or '--theirs' cannot be used with --staged

This seems okay to me, not sure if we have tests to validate this behavior.

Show 15 quoted lines
>>> @@ -2063,11 +2067,7 @@ static int checkout_main(int argc, const char **argv, const char *prefix,
>>>
>>>  	opts->pathspec.recursive = 1;
>>>
>>> -	if (opts->pathspec.nr) {
>>> -		if (1 < !!opts->writeout_stage + !!opts->force + !!opts->merge)
>>> -			die(_("git checkout: --ours/--theirs, --force and --merge are incompatible when\n"
>>> -			      "checking out of the index."));
>>> -	} else {
>>> +	if (!opts->pathspec.nr) {
>>>  		if (opts->accept_pathspec && !opts->empty_pathspec_ok &&
>>>  		    !opts->patch_mode)	/* patch mode is special */
>>>  			die(_("you must specify path(s) to restore"));
>>> --
>>> 2.55.0-884-g76cf8659c2
Previous: Junio C HamanoNext: Junio C Hamano
Message 31 of 47 in “builtin: replace the_repository parameter in is_bare_repository()”
  1. builtin: replace the_repository parameter in is_bare_repository()Hardik Kumar, Aug 27, 2026
  2. Junio C HamanoAug 27, 2026
  3. Junio C HamanoAug 27, 2026
  4. Hardik KumarAug 27, 2026
  5. Junio C HamanoAug 27, 2026
  6. Ben KnobleAug 27, 2026
  7. Junio C HamanoAug 27, 2026
  8. D. Ben KnobleAug 28, 2026
  9. Junio C HamanoAug 28, 2026
  10. 0/8 More sensible checkout/switch/restore code refactoringJunio C Hamano, Aug 28, 2026
  11. 1/8 checkout: pass cb_option explicitly to branch name parsersJunio C Hamano, Aug 28, 2026
  12. 2/8 checkout: validate new branch name in checkout_branch()Junio C Hamano, Aug 28, 2026
  13. 3/8 checkout: validate stage and merge option compatibility in checkout_paths()Junio C Hamano, Aug 28, 2026
  14. 4/8 checkout: extract option validation and pathspec helpersJunio C Hamano, Aug 28, 2026
  15. 5/8 checkout: extract branch setup and tracking helpersJunio C Hamano, Aug 28, 2026
  16. 6/8 checkout: restructure switch, restore, and checkout entrypointsJunio C Hamano, Aug 28, 2026
  17. 7/8 checkout: wrap overly long linesJunio C Hamano, Aug 28, 2026
  18. Junio C HamanoAug 28, 2026
  19. Junio C HamanoAug 29, 2026
  20. 8/8 checkout: move post_checkout_hook() to checkout.cJunio C Hamano, Aug 28, 2026
  21. Junio C HamanoAug 28, 2026
  22. Junio C HamanoAug 29, 2026
  23. 0/8 More sensible checkout/switch/restore code refactoringJunio C Hamano, Aug 30, 2026
  24. 1/8 checkout: pass cb_option explicitly to branch name parsersJunio C Hamano, Aug 30, 2026
  25. Karthik NayakSep 1, 2026
  26. 2/8 checkout: validate new branch name in checkout_branch()Junio C Hamano, Aug 30, 2026
  27. Karthik NayakSep 1, 2026
  28. 3/8 checkout: validate stage and merge option compatibility in checkout_paths()Junio C Hamano, Aug 30, 2026
  29. Karthik NayakSep 1, 2026
  30. Junio C HamanoSep 1, 2026
  31. Karthik NayakSep 2, 2026
  32. Junio C HamanoSep 2, 2026
  33. Karthik NayakSep 3, 2026
  34. 4/8 checkout: extract option validation and pathspec helpersJunio C Hamano, Aug 30, 2026
  35. 5/8 checkout: extract branch setup and tracking helpersJunio C Hamano, Aug 30, 2026
  36. 6/8 checkout: restructure switch, restore, and checkout entrypointsJunio C Hamano, Aug 30, 2026
  37. Karthik NayakSep 1, 2026
  38. Junio C HamanoSep 1, 2026
  39. Karthik NayakSep 2, 2026
  40. 7/8 checkout: wrap overly long linesJunio C Hamano, Aug 30, 2026
  41. 8/8 checkout: move post_checkout_hook() to checkout.cJunio C Hamano, Aug 30, 2026
  42. D. Ben KnobleAug 29, 2026
  43. do not pass "repo" to builtin commmand implementationsJunio C Hamano, Aug 27, 2026
  44. Hardik KumarAug 28, 2026
  45. Junio C HamanoAug 28, 2026
  46. Hardik KumarAug 28, 2026
  47. Hardik KumarAug 27, 2026

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.