当merge.ff = only时,如何壁球合并?

jpm*_*c26 4 git merge

首先,我将merge.ff设置为only,如下所示:

git config --global merge.ff only
Run Code Online (Sandbox Code Playgroud)

我之所以这样,是因为我不希望git在不先与我确认的情况下进行非快进合并。这是确保我有机会做除创建无关的合并提交之外的其他事情的很好的保障。当我确实需要进行非快进合并时,我可以告诉git覆盖我的默认设置:

git merge --no-ff
Run Code Online (Sandbox Code Playgroud)

现在考虑一个具有如下历史记录的git存储库:

单分支

假设出于某些原因,我想将work分支合并到master。(当然,在这种简单情况下,我可以重新设置基准,但假设我还有其他原因要压扁。)通常,您可以使用以下--squash参数进行压扁合并:

git checkout master
git merge --squash work
Run Code Online (Sandbox Code Playgroud)

但是在这种情况下,它会导致错误消息:

fatal: Not possible to fast-forward, aborting.

这种说法很有道理。快进合并是不是可能的,因为这两个分支具有不常见的提交。但这也没关系:我还是想合并。显而易见的解决方案是使用,--no-ff就像我通常会告诉git这是可以的,并且无论如何应该继续进行:

git merge --squash --no-ff work
Run Code Online (Sandbox Code Playgroud)

但这也会产生错误:

fatal: You cannot combine --squash with --no-ff.

那么,如何在不更改配置的情况下让git进行壁球合并?

tor*_*rek 6

回答

使用git -c merge.ff merge --squash <args>

讨论区

壁球“合并”根本不是真正的合并(实际上也不是快进合并),因此git拒绝使用config设置拒绝它们似乎是一个错误。

也就是说,您可以暂时覆盖merge.ff=only设置。实验表明,该方法有效(此外,与合并stash是荒谬的,但我在此存储库中碰巧有一个,实际上我没有在此处合并):

$ git config --global merge.ff=only
$ git merge --squash stash
fatal: Not possible to fast-forward, aborting.
$ git -c merge.ff=false merge --squash stash
fatal: You cannot combine --squash with --no-ff.
$ git -c merge.ff=true merge --squash stash
Squash commit -- not updating HEAD
Automatic merge went well; stopped before committing as requested
Run Code Online (Sandbox Code Playgroud)

(这时我只是git reset --hard用来撤消假合并)。

由于-c默认为=true,我们将在顶部获得答案。