]> git.ipfire.org Git - thirdparty/git.git/commitdiff
Merge branch 'ak/restore-both-incompatible-with-conflicts'
authorJunio C Hamano <gitster@pobox.com>
Sun, 19 Mar 2023 22:03:10 +0000 (15:03 -0700)
committerJunio C Hamano <gitster@pobox.com>
Sun, 19 Mar 2023 22:03:10 +0000 (15:03 -0700)
"git restore" supports options like "--ours" that are only
meaningful during a conflicted merge, but these options are only
meaningful when updating the working tree files.  These options are
marked to be incompatible when both "--staged" and "--worktree" are
in effect.

* ak/restore-both-incompatible-with-conflicts:
  restore: fault --staged --worktree with merge opts

1  2 
builtin/checkout.c

index 21a4335abb0ffe429f276f0afa76db7cae489420,25d269e2f8f89e7a0ea389f8e83beb664bc34688..2b3ae6032d4c91358f6341d7d19e5f5d19a11717
@@@ -490,18 -487,31 +490,31 @@@ static int checkout_paths(const struct 
                die(_("'%s' must be used when '%s' is not specified"),
                    "--worktree", "--source");
  
-       if (opts->checkout_index && !opts->checkout_worktree &&
-           opts->writeout_stage)
-               die(_("'%s' or '%s' cannot be used with %s"),
-                   "--ours", "--theirs", "--staged");
-       if (opts->checkout_index && !opts->checkout_worktree &&
-           opts->merge)
-               die(_("'%s' or '%s' cannot be used with %s"),
-                   "--merge", "--conflict", "--staged");
+       /*
+        * Reject --staged option to the restore command when combined with
+        * merge-related options. Use the accept_ref flag to distinguish it
+        * from the checkout command, which does not accept --staged anyway.
+        *
+        * `restore --ours|--theirs --worktree --staged` could mean resolving
+        * conflicted paths to one side in both the worktree and the index,
+        * but does not currently.
+        *
+        * `restore --merge|--conflict=<style>` already recreates conflicts
+        * in both the worktree and the index, so adding --staged would be
+        * meaningless.
+        */
+       if (!opts->accept_ref && opts->checkout_index) {
+               if (opts->writeout_stage)
+                       die(_("'%s' or '%s' cannot be used with %s"),
+                           "--ours", "--theirs", "--staged");
+               if (opts->merge)
+                       die(_("'%s' or '%s' cannot be used with %s"),
+                           "--merge", "--conflict", "--staged");
+       }
  
        if (opts->patch_mode) {
 -              const char *patch_mode;
 +              enum add_p_mode patch_mode;
                const char *rev = new_branch_info->name;
                char rev_oid[GIT_MAX_HEXSZ + 1];