我可以在git中默认关闭快速转发吗?


263

我真的不能没有想过的时候,我会用git merge,而不是git rebase希望有一个提交露面。有什么方法可以将git配置为默认情况下具有快速转发功能吗?有一个--ff选项的事实似乎意味着有一种方法,但是我似乎无法在文档中找到它。


3
merge当分支没有进行任何提交以便快速转发它们时,我会一直使用分支。这似乎是最简单,最安全的方法。我很好奇,您显然有一个用例。您为什么要在分支的一侧没有提交的情况下创建合并提交?
CB Bailey 2010年

12
我使用分支来创建提交的逻辑分组。因此,如果我进行合并,则基本上是说“这些提交一起进行”的一种方式。您几乎可以将其视为穷人的互动基础和壁球。:-)
杰森·贝克

13
关闭快速转发非常有用,特别是在遵循A成功的Git分支模型
steinybot'Sep

2
请将接受的答案更改为Eric Platon的答案stackoverflow.com/a/6810687/3408-我做了接受的答案中的步骤,然后意识到这仅适用于当前存储库中的master分支,这很愚蠢。
rjmunro 2015年

3
@ jpmc26我猜每个都有。我碰巧不同意那篇文章。查找合并提交的两个父级并不难,并且可以准确地告诉您所做的更改。然后,您可以进行这些更改,并“基于”其他分支。使用平面模型,您必须手动查找和挑选。我们选择拥抱分支。当查看整棵树时,确实很复杂,但这是现实,并行发生多个更改。将所有内容弄平只会掩盖实际发生的事情。
steinybot '16

Answers:


282

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

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

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

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

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

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


142
学习git有点像爬山;但是git会让您一次又一次地攀登同一座山,每次跌落到不同的高度,每次都感到惊讶,因为它没有连接救生索,而不是从小小的悬崖开始,然后发展到更艰难的悬崖。
康妮

12
@托马斯:是的;git pullgit fetch+ git merge
Michelle Tilley 2010年

9
这看起来不错,但是有没有办法针对所有分支机构在全球范围内进行此操作,而不必为每个分支机构进行设置?
bwinton 2011年

33
当心龙。就像@Thomas所说的那样,此选项很危险。每个git pull都会创建合并提交。git pull --ff不会覆盖git config中的mergeoptions = no-ff。
达里波·菲卢斯(Dalbor Filus)2011年

15
如果我厌倦了打字git merge --no-ff (branchname)怎么办?我想像git pull往常一样发挥作用吗?
Dogweather

341

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

git config --add merge.ff false

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

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

文档中

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


18
注意:merge.ff在Git 1.7.6中引入。在旧版本中无效。
克里斯·约翰森

2
对于使用Git 1.7.6的人来说,这是最好,最简单的解决方案。
Ryan Lundy

22
我使用的是别名了一起puff = "pull --ff --ff-only"
stigi

11
还有(现在,请参阅git-scm.com/docs/git-config)选项pull.ff,可以将其设置为only,它将与别名相同。
jotomo 2014年

1
谢谢@jotomo。该功能可从Git v2.0.0(从提交b814da891e8261b909fc5d9fb07b4e8b13989c2d)获得。
埃里克·普拉顿

14

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

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

1
git config --global pull.rebase true#在行尾注意“ true”
zowers

感谢@zowers我已解决此问题
bastian
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.