"Elijah Newren via GitGitGadget" <gitgitgadget@xxxxxxxxx> writes: > From: Elijah Newren <newren@xxxxxxxxx> > > When opt_rebase is true, we still first check if we can fast-forward. > If the branch is fast-forwardable, then we can avoid the rebase and just > use merge to do the fast-forward logic. However, when commit a6d7eb2c7a > ("pull: optionally rebase submodules (remote submodule changes only)", > 2017-06-23) added the ability to rebase submodules it accidentally > caused us to run BOTH a merge and a rebase. Add a flag to avoid doing > both. This is a fun one. Thanks for digging to the bottom of the issue. > diff --git a/builtin/pull.c b/builtin/pull.c > index 3e624d1e008..19899b45c1d 100644 > --- a/builtin/pull.c > +++ b/builtin/pull.c > @@ -976,6 +976,7 @@ int cmd_pull(int argc, const char **argv, const char *prefix) > > if (opt_rebase) { > int ret = 0; > + int ran_ff = 0; > if ((recurse_submodules == RECURSE_SUBMODULES_ON || > recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND) && > submodule_touches_in_range(the_repository, &rebase_fork_point, &curr_head)) > @@ -992,10 +993,12 @@ int cmd_pull(int argc, const char **argv, const char *prefix) > if (is_descendant_of(merge_head, list)) { > /* we can fast-forward this without invoking rebase */ > opt_ff = "--ff-only"; > + ran_ff = 1; > ret = run_merge(); > } > } > - ret = run_rebase(&curr_head, merge_heads.oid, &rebase_fork_point); > + if (!ran_ff) > + ret = run_rebase(&curr_head, merge_heads.oid, &rebase_fork_point); > > if (!ret && (recurse_submodules == RECURSE_SUBMODULES_ON || > recurse_submodules == RECURSE_SUBMODULES_ON_DEMAND)) > > base-commit: 274b9cc25322d9ee79aa8e6d4e86f0ffe5ced925