Junio C Hamano wrote: > Just to show what was pushed out on 'seen' while I was cutting the > preview release... > > This is based on Felipe's v6 (which was mislabled as v5 but sent on > a different day from the true v5), with two clean-up commits > inserted between Felipe's second step (now 2/5) and the third step > (now 5/5, with necessary adjustments). > > Even with the "correct condition" clean-up, I am not quite happy > with the clarity of the logic around there. > > I think !opt_ff does not exactly belong to the condition, if we > consider that the eventual endgame should be to stop non-ff > operation without merge or rebase by default with an error, and that > should happen in this block. The error message there should say > "unable to fast-forward; must merge or rebase", which should equally > apply to those who gave "--ff-only" explicitly, even though they may > not need the advice message. Agreed. Additionally it doesn't make sense that --ff skips the warning entirely, even though the user has not specified a merge or a rebase (as you yourself noted in a review of the test cases). > To avoid the ugly-looking "strcmp()" in the above, we may need to > adjust "--ff" (fast-forward without creating an extra merge commit) > and "--no-ff" (create an extra merge commit when the history could > be fast-forwarded) to imply "merge", though. It would automatically > make rebase_unspecified would become false. With such a tweak, we > can then simplify it further to > > - if (rebase_unspecified && !can_ff && > - (!opt_ff || !strcmp("--ff-only", opt_ff))) { > + if (rebase_unspecified && !can_ff) { Currently this is a rebase: git pull --rebase --ff With your proposed change it would be an implied merge. I think it makes sense, but it's still a change in behavior. This patch should do the trick: --- a/builtin/pull.c +++ b/builtin/pull.c @@ -973,6 +973,11 @@ int cmd_pull(int argc, const char **argv, const char *prefix) if (opt_rebase < 0) opt_rebase = config_get_rebase(&rebase_unspecified); + if (opt_ff && (!strcmp(opt_ff, "--ff") || !strcmp(opt_ff, "--no-ff"))) { + opt_rebase = 0; + rebase_unspecified = 0; + } + if (read_cache_unmerged()) die_resolve_conflict("pull"); Or do you mean --ff doesn't override --rebase? Therefore it's more of an internal conceptual change. -- Felipe Contreras