git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: Can't squash merge with merge.ff set to false

From
Bryan Turner <bturner@atlassian.com>
Date
Jan 5, 2018, 20:54 UTC
Message-ID
<CAGyf7-E-7KUCAM8SeG-2powp2XN+H=16VG-6XBmj1wUT9tjVcw@mail.gmail.com>
In-Reply-To
<CAHd499A_ANzFA8HSQLJWakzzWanbmVGnur=um=kquYHu0aCBcQ@mail.gmail.com>
On Fri, Jan 5, 2018 at 12:35 PM, Robert Dailey <rcdailey.lists@gmail.com> wrote:
Show 16 quoted lines
> On Fri, Jan 5, 2018 at 2:26 PM, Paul Smith <paul@mad-scientist.net> 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@gmail.com> 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.

Show 15 quoted lines
>>
>> 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.

Show 5 quoted lines
> 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.

Previous: Robert DaileyNext: Robert Dailey
Message 5 of 7 in “Can't squash merge with merge.ff set to false”
  1. Robert DaileyJan 5, 2018
  2. Bryan TurnerJan 5, 2018
  3. Paul SmithJan 5, 2018
  4. Robert DaileyJan 5, 2018
  5. Bryan TurnerJan 5, 2018
  6. Robert DaileyJan 5, 2018
  7. Jonathan NiederJan 6, 2018

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.