【问题标题】:Can I make fast forwarding be off by default in git?我可以在git中默认关闭快速转发吗?
【发布时间】:2011-01-30 19:31:57
【问题描述】:

我真的想不出什么时候我会使用git merge 而不是git rebase 并且希望提交出现。有什么方法可以将 git 配置为默认关闭快速转发?有一个--ff 选项的事实似乎暗示有一种方法,但我似乎无法在文档中找到它。

【问题讨论】:

  • 我一直使用merge 用于分支,当没有从远程提交任何提交以快速转发它们时。这似乎是最简单和最安全的方法。我很好奇,你显然有一个用例。为什么要在分支的一侧没有提交的情况下创建合并提交?
  • 我使用分支来创建提交的逻辑分组。因此,如果我进行合并,这基本上是一种说“这些提交一起”的方式。您几乎可以将其视为穷人的交互式 rebase 和 squash。 :-)
  • 关闭快进非常有用,尤其是在关注A successful Git branching model这样的模型时
  • 请将已接受的答案更改为 Eric Platon 的回答 stackoverflow.com/a/6810687/3408 - 我做了已接受答案中的步骤,然后意识到它仅适用于当前存储库中的主分支,这很愚蠢.
  • @jpmc26 我猜每个人都有自己的想法。我碰巧不同意那篇文章。找到合并提交的两个父节点并不难,它会告诉您确切的更改是什么。然后,您可以进行这些更改并“重新定位”其他分支。使用平面模型,您必须手动查找和挑选。我们选择拥抱分支。当然,查看整个树时会很复杂,但事实就是这样,多个变化同时发生。扁平化一切只是隐藏了真正发生的事情。

标签: git merge branch rebase fast-forward


【解决方案1】:

好吧,10 年后它可以工作了:D

git config --merge.ff no

【讨论】:

    【解决方案2】:

    线程中似乎还有一个悬而未决的问题:如何在全球范围内进行(即针对所有分支)?对于记录,我们可以使用以下内容:

    git config --add merge.ff false
    

    ...使其适用于当前存储库中的所有分支。要使其适用于所有存储库中的所有分支,如果有人没有在没有--global 选项(本地设置覆盖全局)的情况下运行它(本地设置覆盖全局),请运行以下命令:

    git config --global --add merge.ff false
    

    来自documentation

    merge.ff
    默认情况下,git 在合并作为当前提交的后代的提交时不会创建额外的合并提交。相反,当前分支的尖端是快进的。当设置为 false 时,此变量告诉 git 在这种情况下创建一个额外的合并提交(相当于从命令行提供 --no-ff 选项)。当设置为 only 时,只允许这样的快进合并(相当于从命令行给出--ff-only 选项)。

    【讨论】:

    • 注意:merge.ff 是在 Git 1.7.6 中引入的。它在旧版本中无效。
    • 对于使用 Git 1.7.6 的人来说,这是最好和最简单的解决方案。
    • 我将它与别名puff = "pull --ff --ff-only"一起使用
    • 还有(现在,请参阅git-scm.com/docs/git-config)选项 pull.ff 可以设置为 only,它会做同样的事情作为别名。
    • 谢谢你,@jotomo。该功能可从 Git v2.0.0 获得(来自提交 b814da891e8261b909fc5d9fb07b4e8b13989c2d)。
    【解决方案3】:

    是的,有--no-ff。您可以为每个分支配置合并选项,例如

    git config branch.master.mergeoptions  "--no-ff"
    

    将以下内容添加到您的 $(REPO)/.git/config 文件中:

    [branch "master"]
        mergeoptions = --no-ff
    

    脚注:谈到我的经验,我最终发现将快进切换到关闭对 git 新手最有帮助 - 但是一旦对工作流程和概念的感觉开始深入人心,你肯定希望避免模糊你的日志图有大量毫无意义的“合并远程 ..blarf”类型的提交。

    十年后的脚注 2:下面的其他答案提供了更现代的配置选项,但实际上,您可能确实希望在当今时代保持默认设置(即尽可能快进),因为空的合并提交实际上只会使历史更难以推理。

    【讨论】:

    • 学习git有点像爬山;但是 git 不是从小悬崖开始,然后发展到更艰难的悬崖,而是让你一次又一次地攀登同一座山,只是每次都掉在不同的高度,每次都因为没有连接生命线而感到惊讶。
    • @Thomas:是的; git pullgit fetch + git merge
    • 这看起来不错,但是有没有办法在全局范围内为所有分支执行此操作,而不必为每个分支设置它?
    • 小心龙。正如@Thomas 所说,这个选项很危险......每个 git pull 都会创建合并提交。 git pull --ff 不会覆盖 git config 中的 mergeoptions=no-ff。
    • 如果我只是厌倦了输入git merge --no-ff (branchname) 怎么办?我希望git pull 能够一如既往地发挥作用?
    【解决方案4】:

    阅读答案我最终使用了以下两个选项

    git config --global pull.ff only # Disallows non ff merges on pull. Overrides merge.ff when pulling
    git config --global merge.ff false # even create extra merge commit when fast forward merge would be possible
    

    只是松散相关 我还发现这个设置可以避免拉动过程中的麻烦

    git config --global pull.rebase true # set up pull to rebase instead of merge
    

    【讨论】:

    • git config --global pull.rebase true # 注意行尾的'true'
    • 感谢@zowers 我已经解决了这个问题
    • 是的!排名靠前的答案错过了这一点。此外,可以说是事实上的标准 Git Common Flow 说:“建议使用 git merge --no-ff 合并所有分支”但是当你拉动时,合并已经发生,所以这似乎是 2021 年的最佳答案——至少对我而言。
    猜你喜欢
    • 2011-02-21
    • 1970-01-01
    • 2013-03-11
    • 1970-01-01
    • 2015-06-18
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多