]> git.ipfire.org Git - thirdparty/git.git/commitdiff
pull: since --ff-only overrides, handle it first
authorElijah Newren <newren@gmail.com>
Thu, 22 Jul 2021 05:04:46 +0000 (05:04 +0000)
committerJunio C Hamano <gitster@pobox.com>
Thu, 22 Jul 2021 18:54:29 +0000 (11:54 -0700)
There are both merge and rebase branches in the logic, and previously
both had to handle fast-forwarding.  Merge handled that implicitly
(because git merge handles it directly), while in rebase it was
explicit.  Given that the --ff-only flag is meant to override any
--rebase or --no-rebase, make the code reflect that by handling
--ff-only before the merge-vs-rebase logic.

It turns out that this also fixes a bug for submodules.  Previously,
when --ff-only was given, the code would run `merge --ff-only` on the
main module, and then run `submodule update --recursive --rebase` on the
submodules.  With this change, we still run `merge --ff-only` on the
main module, but now run `submodule update --recursive --checkout` on
the submodules.  I believe this better reflects the intent of --ff-only
to have it apply to both the main module and the submodules.

(Sidenote: It is somewhat interesting that all merges pass `--checkout`
to submodule update, even when `--no-ff` is specified, meaning that it
will only do fast-forward merges for submodules.  This was discussed in
commit a6d7eb2c7a ("pull: optionally rebase submodules (remote submodule
changes only)", 2017-06-23).  The same limitations apply now as then, so
we are not trying to fix this at this time.)

Signed-off-by: Elijah Newren <newren@gmail.com>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
builtin/pull.c

index d97966048259b492ba75f2c9c66042772532c680..1f452020375fce2c028482bff00ac75db9ad949f 100644 (file)
@@ -1046,15 +1046,15 @@ int cmd_pull(int argc, const char **argv, const char *prefix)
 
        can_ff = get_can_ff(&orig_head, &merge_heads.oid[0]);
 
-       if (!can_ff) {
-               if (opt_ff) {
-                       if (!strcmp(opt_ff, "--ff-only"))
-                               die_ff_impossible();
-               } else {
-                       if (rebase_unspecified && opt_verbosity >= 0)
-                               show_advice_pull_non_ff();
-               }
+       /* ff-only takes precedence over rebase */
+       if (opt_ff && !strcmp(opt_ff, "--ff-only")) {
+               if (!can_ff)
+                       die_ff_impossible();
+               opt_rebase = REBASE_FALSE;
        }
+       /* If no action specified and we can't fast forward, then warn. */
+       if (!opt_ff && rebase_unspecified && !can_ff)
+               show_advice_pull_non_ff();
 
        if (opt_rebase) {
                int ret = 0;