Re: pull.rebase config vs. --ff-only on command line
From: Felipe Contreras <hidden>
Date: 2021-07-19 17:49:37
Matthias Baumgarten wrote:
On 7/16/21 8:00 PM, Felipe Contreras wrote:quoted
Matthias Baumgarten wrote:quoted
On 7/16/21 6:44 PM, Felipe Contreras wrote:quoted
Elijah Newren wrote:quoted
On Fri, Jul 16, 2021 at 7:52 AM Matthias Baumgarten [off-list ref] wrote:quoted
this is my first time contacting you guys and girls so I hope this mail achieves the expected standard. I've discovered the following behaviour of git: If pull.rebase is configured to true and git pull --ff-only is executed it seems like the config wins, i.e. issuing "Successfully rebased and updated refs/heads/...", which is not what I would expect. I always believed that command line options would overwrite configured options. Is my assumption that command line options always win wrong or is this a bug?It's a bug.No it isn't. Elijah is elevating to fact his opinion of what --ff-only should be changed to. But it has not been changed. Today --ff-only is meant only for the merge mode of `git pull`, and like other merge-only options (e.g. --ff, --no-ff, and --squash) it's ignored in the rebase mode.Shouldn't every explicitly given merge option (like --ff-only) overwrite any configured option that would not even result in a merge, i.e. forcing a merge and thus forcing ff-only?Perhaps. Other developers have suggested that before. The problem is that everyone wants to make --ff-only the default, and then we start to get into a tricky situation, because what should these do: git -c pull.ff=only pull git -c pull.ff=only pull --merge git -c pull.ff=only pull --rebaseIf my assumption were true, and every explicit (cli given) option would overwrite implicitly given ones (i.e. configured options), wouldn't * git -c pull.ff=only pull, do a fast-forward (or merge) * git -c pull.ff=only pull --merge, force a merge commit * git -c pull.ff=only pull --rebase, force rebase
The documentation says --ff-only is meant for merges, therefore these
three should be valid and do the same:
git pull --ff-only # --merge is the default
git pull --merge --ff-only
git pull --ff-only --merge
In order for your assumption above to be correct, the semantics of
--ff-only have to be changed (along with the documentation), but people
are *already* relying on the current semantics:
[pull]
ff = only
rebase = true
I made a poll on reddit [1], and 19% (so far) said they do use both
configurations, and they know what `git pull --no-rebase` would do.
In other words: they would expect `git pull` to do a rebase, but
`git pull --merge` to do a fast-forward merge.
Changing the semantics of --ff-only would break behavior they rely on,
unless we break symmetry from --ff-only and pull.ff=only which would be
very hard to explain the documentation.
However, if --ff-only wasn't mapped to pull.ff=only, but
pull.mode=fast-forward, then we can have both: the configurations people
rely on today wouldn't be broken, and your expectation that
`git pull --ff-only` overrides pull.mode=rebase would be met.
It's the perfect solution.
quoted
One of these will always fail, when it shouldn'tWould this even apply under the above assumption?
[I think you meant to paste this] Under your assumption it wouldn't fail, but other behavior users rely on today would be broken.
quoted
I proposed a solution for that, but is has been ignored.I'm sorry!
It's not me the one that suffers (I don't even use `git pull`), it's the users that have been negatively affected for more than ten years. [1] https://www.reddit.com/r/git/comments/omcngl/do_you_use_both_pullff_and_pullrebase/ -- Felipe Contreras