默认情况下,如何使我的所有存储库都使用Git pull使用rebase?


186

有没有一种方法可以设置主机Git存储库,以便默认情况下git pull使用其(本地)克隆所做的任何操作--rebase?通过搜索Stack Overflow,我了解了branch.autosetuprebase,但是需要单独为每个克隆配置它。

设置我的项目流程是为了在我们pull将功能分支分支到该develop分支之前merge进行分支。这pull几乎总是使用--rebase,因此我试图弄清楚这是否可以是默认值。


6
你为什么要那个?我认为教导用户积极考虑哪种情况更合适(基于他们从上游做出或期望的更改的幅度)更合理”
乔纳斯·谢弗(JonasSchäfer

4
@JonasWielicki是的,我同意。只是我的一些团队成员是Git的新手,我想知道是否有一种方法可以强制执行它,以避免在初始阶段出现问题(直到他们学会了它)。该团队还在不同的时区进行远程工作,这意味着如果出现问题,他们将被困几个小时。只是想知道这是否可能。
蒙面侠

1
我认为特别是对于初始设置,最好进行合并。如果您的代码确实有分歧,Rebase将使事情变得更加奇怪。您必须一遍又一遍地解决相同的冲突,直到您推送为止。因此,如果团队成员想要处理某些代码,总是使用rebase并且直到完成后才推送(新手可能会这样做,而不是自己分支),他们将面临已经解决X次的相同冲突。
乔纳斯·谢弗(JonasSchäfer)2012年

3
@JonasWielicki团队成员确实为他们使用的每个新功能创建了一个新分支(对此,他们已经非常了解)。之所以需要重新设置基准,是因为其他开发人员在准备好进行更改时已承诺加入“远程”开发分支。因此,我希望他在推动更改之前先从远程进行拉动重新定位。该项目本身已经相当成熟,只有团队是新的。:)因此,这仅是在人员方面的“初始设置”。您对此情况有何建议?
蒙面侠

5
在大多数情况下(几乎所有情况下)回复您的第一条评论,因为要花费大量时间来彻底测试新功能等,重新选择基准是正确的选择。到完成时,肯定会有其他开发人员的大量提交。
蒙面侠

Answers:


205

现在有3种不同的默认拉动行为配置级别。从最普通的到最细的颗粒是:

1。 pull.rebase

将此设置为true意味着git pull始终等于git pull --rebase(除非branch.<branchname>.rebase明确设置为false)。也可以针对每个存储库或全局进行设置。

2。 branch.autosetuprebase

将此设置为always意味着无论何时创建跟踪分支,都会为其创建一个配置条目,如下所示。为了获得更精细的控制,还可以将其设置为neverlocal或者remote可以对每个存储库或全局进行设置。请参阅git config --help以获取更多详细信息。

3。 branch.<branchname>.rebase

将此设置为true意味着该特定分支将始终通过重新定级从其上游拉出,除非git pull --no-rebase明确使用。

结论

因此,虽然您无法更改存储库的所有将来克隆的默认行为,但是可以通过更改所有当前用户(现有和将来)存储库的默认行为git config --global pull.rebase true


4
感谢您的答复。我正在探索是否可以进行设置,以便克隆存储库的任何人都默认启用它。上面的设置将存储在中~/.gitconfig,这意味着每个克隆主机存储库的开发人员都需要运行命令。不抱怨您的解决方案。这是一个很好的建议,我只想确认我正确理解了您的观点。
蒙面侠

感谢你的回答。确实的确看起来这是可以接近的。
蒙面侠

138

怎么样

git config --global pull.rebase true

这将告诉git始终使用rebase拉。


3
谢谢,这非常适合现有的跟踪分支。
2014年

1
请删除--bool,这是不必要的
diralik

38

答案是不。

没有设置远程存储库的方法,因此克隆它的每个人都具有git pull更改的默认行为。

你可以,但是,建立一个服务器端挂钩,检查,没有人推合并的提交(这样的事情,也许)。

您可能还对某些配置选项感兴趣。从远程存储库克隆的所有开发人员都必须手动对其进行设置。

1.选项 branch.<name>.rebase

您可以将本地分支配置为始终使用--rebase,以这种方式替换<name>为分支名称:

git config branch.<name>.rebase true

在上运行此命令后master,其中的master部分.git/config如下所示:

[branch "master"]
    remote = origin
    merge = refs/heads/master
    rebase = true

2.选项 branch.autosetuprebase

为每个Git分支运行该先前的config命令可能很麻烦,因此您可以配置Git为每个新分支自动设置它:

git config branch.autosetuprebase always

(您还可以指定neverremotelocalman git-config以了解详细信息。)

如果没有该--global选项,则配置将保存到.git/config,并且仅影响当前存储库。使用--global,配置将保存到~/.gitconfig,并且每个未配置的存储库都会受到影响。

此选项不会影响已经存在的分支。

3.选项 pull.rebase

git config --bool pull.rebase true

(您也可以给它--global选项。)

如果此选项为true,git pullgit pull --rebase除非branch.<name>.rebase已设置为,否则运行等效于false


3

在给定分支上--rebase发出时,这使该选项成为默认选项git pull

@Flimm,我需要添加内容true以使您的第一个选项起作用。

因此正确的语法是:

git config branch.<branch>.rebase true

要在develop分支上运行此命令:

git config branch.develop.rebase true

现在,其中的develop部分.git/config如下所示:

[branch "develop"]
        remote = origin
        merge = refs/heads/develop
        rebase = true

谢谢,我已经编辑了答案,以后可以随时自己编辑答案。
Flimm

2
Donwvoter,无论您是谁,请解释您的原因。不加评论地投票对我来说似乎是完全武断的,没有建设性。
大石

1

当前无法设置存储库的默认策略。

如果您自己想要它,并且至少使用git 1.7.9,则可以pull.rebase按如下所示全局设置配置:

git config --global pull.rebase true

但是,您必须在每台计算机上执行操作。一种选择是使用该选项配置默认用户主模板/框架。但是,用户可以更改该选项。

如果您不希望合并,则可以定义服务器端挂钩以拒绝合并合并的请求。

供您参考,他是pull.rebase 的源文档

如果为true,则将分支重新放置在已获取分支的顶部,而不是在运行“ git pull”时从默认远程合并默认分支。请参阅“分支..rebase”以在每个分支的基础上进行设置。

合并时,将--rebase-merges选项传递给git rebase,以便本地合并提交包含在rebase中( 有关详细信息,请参见git-rebase)。

保留时,也将--preserve-merges传递给git rebase,这样本地提交的合并提交将不会通过运行git pull进行展平。

当值是交互式的时,变基将以交互式模式运行。

注意:这可能是危险的操作;除非您了解其中的含义,否则不要使用它(有关详细信息,请参见git-rebase)。

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.