【问题标题】:How to make Git pull use rebase by default for all my repositories?默认情况下,如何让 Git pull 对我的所有存储库使用 rebase?
【发布时间】:2012-11-30 13:02:18
【问题描述】:

有没有办法设置主机 Git 存储库,以便从其(本地)克隆完成的任何 git pull 默认使用 --rebase?通过在 StackOverflow 上搜索,我了解到 branch.autosetuprebase,但它需要为每个克隆单独配置。

我的项目流程设置为在 merge 向其添加功能分支之前,我们 pull develop 分支。这个pull 几乎总是使用--rebase,所以我想弄清楚这是否可以成为默认值。

【问题讨论】:

  • 你为什么要那个?我认为教用户积极思考哪种情况更合适(基于他们对上游所做的更改或期望的更改幅度)更合理'
  • @JonasWielicki 是的,我同意。只是我的一些团队成员是 Git 的新手,我想知道是否有办法强制执行它以避免在初始阶段出现问题(直到他们学会了它)。该团队还在不同的时区远程工作,这意味着如果出现问题,他们将被困几个小时。只是想知道这是否可能。
  • 我认为特别是对于初始设置,最好进行合并。如果你的代码真的有分歧,rebase 会做出更奇怪的事情。您必须一遍又一遍地解决相同的冲突,直到您推动为止。所以如果一个团队成员想要处理一些代码,总是使用 rebase 并且在他完成之前不推送(新人可能会这样做,而不是自己分支),他们将面临他们已经解决 X 次的相同冲突.
  • @JonasWielicki 团队成员确实为他们工作的每个新功能创建一个新分支(他们已经非常了解这一点)。之所以需要 rebase,是因为其他开发人员在他准备好推送他的更改时已经致力于“远程”开发分支。因此,我希望他在推送他的更改之前从远程执行 pull rebase。项目本身已经相当成熟,只是团队是新人。 :) 所以它只是对人的“初始设置”。您对这种情况有何建议?
  • 回复您的第一条评论,在大多数情况下(几乎所有),rebase 是正确的选择,因为彻底测试新功能需要花费大量时间等。完成后,肯定会有来自其他开发人员的大量提交。

标签: git


【解决方案1】:

答案是否定的。

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

但是,您可以设置一个服务器端挂钩,检查没有人推送合并提交(可能是something like this)。

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

1。选项branch.<name>.rebase

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

git config branch.<name>.rebase true

master 上运行此程序后,.git/config 中的master 部分如下所示:

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

2。选项branch.autosetuprebase

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

git config branch.autosetuprebase always

(也可以指定neverremotelocal,详见man git-config。)

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

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

3。选项pull.rebase

git config pull.rebase true

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

如果此选项为真,则运行git pull 等效于git pull --rebase,除非branch.&lt;name&gt;.rebase 已设置为false

【讨论】:

  • 真正回答问题的唯一答案。
【解决方案2】:

怎么样

git config --global pull.rebase true

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

【讨论】:

  • 谢谢,这对现有的跟踪分支非常有用。
  • 请去掉--bool,没必要
  • 这对我不起作用:git config --global pull.rebase false
【解决方案3】:

目前无法为存储库设置默认策略。

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

git config --global pull.rebase true

但是您必须在每台机器上执行此操作。一种选择是使用该选项配置默认用户主页模板/骨架。但是,用户可能会更改该选项。

如果您不想合并,您可以定义一个服务器端挂钩来拒绝合并推送。

供您参考,他是 pull.rebase 的source documentation

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

合并时,将 --rebase-merges 选项传递给 git rebase 以便本地合并提交包含在 rebase 中(请参阅git-rebase 详情)。

当保存时,还将 --preserve-merges 传递给 git rebase 以便本地提交的合并提交不会通过运行变平 git 拉。

当值是交互式时,rebase 以交互模式运行。

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

【讨论】:

    【解决方案4】:

    默认拉取行为现在有 3 种不同级别的配置。从最一般到最细粒度的它们是:

    1。 pull.rebase

    将此设置为true 意味着git pull 始终等价于git pull --rebase(除非branch.&lt;branchname&gt;.rebase 明确设置为false)。这也可以按存储库或全局设置。

    2。 branch.autosetuprebase

    将此设置为always 意味着无论何时创建跟踪分支,都会为其创建如下配置条目。对于更细粒度的控制,这也可以设置为neverlocalremote,并且可以按存储库或全局设置。详情请见git config --help

    3。 branch.&lt;branchname&gt;.rebase

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

    结论

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

    【讨论】:

    • 感谢您的回复。我正在探索是否可以进行设置,以便克隆存储库的任何人都默认启用它。上述设置将存储在~/.gitconfig 中,这意味着克隆主机存储库的每个开发人员都需要运行该命令。不要抱怨你的解决方案。很好,我只是想确认我正确理解了您的观点。
    • 感谢您的回答。看起来确实如此接近。
    【解决方案5】:

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

    @Flimm,我需要添加 true 才能使您的第一个选项生效。

    所以正确的语法是:

    git config branch.<branch>.rebase true
    

    develop 分支上运行此命令:

    git config branch.develop.rebase true
    

    现在.git/config 中的develop 部分看起来像这样:

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

    【讨论】:

    • 谢谢,我已经编辑了我的答案,以后您可以自己编辑答案。
    • Donwvoter,无论你是谁,请说明你的理由。对我来说,不加评论就投反对票似乎完全武断且没有建设性。
    猜你喜欢
    • 2017-04-30
    • 1970-01-01
    • 1970-01-01
    • 2013-07-21
    • 2014-08-31
    • 2012-07-11
    • 2022-01-15
    • 2022-08-03
    • 2021-11-17
    相关资源
    最近更新 更多