On Mon, Nov 23, 2020 at 09:41:05PM -0600, Felipe Contreras wrote: > What we really need is something like: > > 1. git pull # fail by default unless it's a fast-forward > 2. git pull --merge # force a merge (unless it's a fast-forward, > depending on pull.ff) > 3. git pull --rebase # force a rebase (unless it's a fast-forward, > depending on pull.ff) > > Therefore, what we really want is "git pull --rebase" *ignore* > "pull.ff=only" (a possible default) or ignore "pull.rebase=ff-only" > (also another possible default). Yep. After reading the first half of your mail, I started to respond with the exact same thing. The key thing is letting the command-line options override all of the related config. But I guess after reading to the end that you don't actually like this. ;) I do agree it would be more clear in the long run with a single option (config and command-line) that makes it clear the values are mutually exclusive. I'm just not sure if it's painful to get there without breaking compatibility or introducing confusion in the meantime. > It would be possible to do something like: > > if (!opt_rebase && (!opt_ff || !strcmp(opt_ff, "--ff-only"))) > turn_default_behavior = 1; > > But then how would we distinguish between "git pull", and "git pull > --no-rebase" (aka. "git pull --merge" / "pull.rebase=false")? I'm not sure what you mean. We can tell the difference between those based on what we saw on the command-line option. I.e., your "!opt_rebase" is really a tri-state, which allows something like: if (opt_rebase == REBASE_UNSET) { if (opt_ff == FF_UNSET) opt_ff = ff_default; /* from config or baked-in */ } opt_rebase = rebase_default; } but I didn't look at the logic in git-pull. That said... > This is just too much unnecessary complication There's no need to > entertain a dozen possible heuristics to avoid "pull.mode", none of > which avoid breaking existing behavior. > > Let's just accept we need push.mode, and then we can have everything: > default, ff-only, merge, rebase. I think it could be possible for the documentation to make clear the interactions, especially if the feature is designed with eventual deprecation of other options (e.g., if it says "pull.mode=ff-only" means that pull.ff won't be examined, and there's no need to ever use it anymore). -Peff