git - 仅当 merge.ff = 时如何压缩 merge ?

标签 git merge

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

git config --global merge.ff only

我之所以这样,是因为我不想让 git 在没有先与我确认的情况下进行非快进 merge 。这是一个很好的保障,以确保我有机会做一些事情而不是创建一个无关的 merge 提交。当我确实需要进行非快进 merge 时,我可以告诉 git 覆盖我的默认设置:

git merge --no-ff

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

single diverging branch

假设出于某种原因我想将 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/

相关文章:

python - pandas 中的笛卡尔积

Git 子模块提交 Hook

linux - 在 git bash 中设置斜杠目录

javascript - 合并 Javascript 对象中的嵌套数组

git - 使用 Sourcetree 命名 merge

arrays - 如何将数组的每个元素压缩到 ruby​​ 中另一个数组的每个元素?

git - 将存储库从 Gitlab 迁移到 Azure DevOps

git - 如何列出 Git 存储库中所有已删除的文件?

git - 我如何 git push 特定分支?

c# - 合并具有嵌套类的同一类的两个对象