首先,我将 merge.ff
设置为 only
,如下所示:
git config --global merge.ff only
我之所以这样,是因为我不想让 git 在没有先与我确认的情况下进行非快进 merge 。这是一个很好的保障,以确保我有机会做一些事情而不是创建一个无关的 merge 提交。当我确实需要进行非快进 merge 时,我可以告诉 git 覆盖我的默认设置:
git merge --no-ff
现在考虑一个具有如下历史记录的 git 存储库:
假设出于某种原因我想将 work
分支 merge 到 master
上。 (在这种简单的情况下,当然,我可以只 rebase ,但假设我有其他原因需要挤压。)您通常使用 --squash
参数进行挤压 merge :
git checkout master
git merge --squash work
但在这种情况下,它会导致错误消息:
fatal: Not possible to fast-forward, aborting.
这种说法很有道理。快进 merge 是不可能的,因为两个分支都有不同的提交。但这也没关系:无论如何我都想进行 merge 。显而易见的解决方案是使用 --no-ff
,就像我通常会告诉 git 这没关系,无论如何它应该继续:
git merge --squash --no-ff work
但这也会报错:
fatal: You cannot combine --squash with --no-ff.
那么如何在不更改配置的情况下让 git 压缩 merge 呢?
最佳答案
回答
使用 git -c merge.ff merge --squash <args>
.
讨论
压缩“merge ”根本不是真正的 merge (事实上,也不是快进 merge ),所以 git 拒绝它们与配置设置似乎是一个错误。
不过,您可以暂时覆盖您的 merge.ff=only
环境。实验表明这是有效的(除此之外,与 stash
merge 是荒谬的,但我碰巧在这个 repo 中有一个,我实际上并没有在这里 merge ):
$ 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
(此时我只是使用 git reset --hard
来撤销假 merge )。
自 -c
默认为 =true
,我们在顶部得到答案。
关于git - 仅当 merge.ff = 时如何压缩 merge ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36486966/