On Fri, Jan 5, 2018 at 12:35 PM, Robert Dailey <rcdailey.lists@xxxxxxxxx> wrote: > On Fri, Jan 5, 2018 at 2:26 PM, Paul Smith <paul@xxxxxxxxxxxxxxxxx> wrote: >> On Fri, 2018-01-05 at 12:12 -0800, Bryan Turner wrote: >>> On Fri, Jan 5, 2018 at 11:59 AM, Robert Dailey <rcdailey.lists@xxxxxxxxx> wrote: >>> >>> As for why the two aren't allowed together, my assumption would be >>> because if you're only squashing a single commit "--squash" and that >>> commit is fast-forward from the target, a new commit is not created >>> and instead the target branch is fast-forwarded. With "--no-ff", it's >>> questionable what "--squash" should do in that case. Fast-forward >>> anyway? Rewrite the commit simply to get new committer details and >>> SHA-1? >> >> If it only failed when you were squash-merging a single commit that was >> also fast-forwardable, I guess that would be one thing. But even if I >> have multiple commits and I want to squash-merge them, which clearly is >> a separate operation giving different results, I get this error. I think there's a reasonable argument that having the failure be consistent is easier to reason about, and therefore provides a "better" user experience (to some definition of "better" which all people may not share in common). If the failure was delayed until "git merge --squash" decided it wanted to fast-forward, the failure might seem more arbitrary. >> >> I don't think Git should try to be clever here (if that's what it's >> doing--I always assumed it was just a missing configuration case in the >> error check). If I asked for a squash-merge then Git should give me a >> squash merge. >> >> So in answer to your question, --squash should give me a squash merge >> and the setting of --ff / --no-ff should be completely ignored, as it's >> irrelevant. >> >> My $0.02. > > Seems like --ff works, but is also misleading since in my case (more > than one commit) I'm not doing a ff merge and there's no possibility > of it. "--ff" doesn't say "git merge" _must_ fast-forward ("--ff-only"); it says that it _can_. At a general level with "--squash", that seems to be exactly correct. A "--squash" merge can create a new commit, or it can fast-forward an existing commit if the situation allows. Based on that, passing "--ff" doesn't seem misleading to me. > I think your idea of the 2 being distinctly separate makes > sense. Basically, --squash takes precedence and if the mechanism to > implement squash in certain scenarios (such as single commit) is > fast-forward merge, then that decision is made for the user and is no > longer something they can control. The two _aren't_ distinctly separate, though. "git merge --squash --ff-only" has very different semantics to "git merge --squash --ff", in that it will only create a new squashed commit (or fast-forward a single commit) if the incoming commit(s) are fast-forward from the target. So there _is_ a setting for the fast-forward mode (given "--ff", "--ff-only", and "--no-ff" are a tri-state switch, and therefore comprise a single setting) that does impact squashing.