警告:push.default未设置;在Git 2.0中,它的隐式值正在更改。

1661

我已经使用Git一段时间了,最近下载了一个更新,但当我尝试push时发现出现了这个警告信息。

warning: push.default is unset; its implicit value is changing in 
Git 2.0 from 'matching' to 'simple'. To squelch this message 
and maintain the current behavior after the default changes, use: 

  git config --global push.default matching

To squelch this message and adopt the new behavior now, use: 

  git config --global push.default simple

我显然可以将其设置为提到的值之一,但它们意味着什么? simplematching 之间有什么区别?

如果我在一个客户端上更改它,那么我是否需要在与我共享 repos 的其他客户端上执行任何操作?


2
https://dev59.com/mnNA5IYBdhLWcg3wdtv5 - gliptak
https://dev59.com/mnNA5IYBdhLWcg3wdtv5#948397 - frogatto
1
注意:git 2.8(2016年3月)将删除该警告!请参见https://dev59.com/AmIj5IYBdhLWcg3w95gc#22356644。 - VonC
5个回答

2167

这个在文档中有详细的解释,但我来做一个简要概括:

  • matching表示git push会将所有本地分支推送到具有相同名称的远程分支,这容易意外推送你不打算推送的分支。

  • simple表示git push仅会将当前分支推送到与git pull拉取的那个分支匹配的分支,并且还会检查它们的名称是否匹配。这是更直观的行为,所以默认值被更改为此设置。

此设置仅影响您本地客户端的行为,并且可以通过在命令行上明确指定要推送哪些分支来覆盖它。其他客户端可能有不同的设置,它只影响您没有指定要推送哪些分支时发生的情况。


16
很高兴知道这个变化。当我刚开始使用Git时,我不小心推送了所有本地分支,以为 git push 只会推送当前分支。 - rahul286
51
动机在于,根据经验,大多数人都预期新的默认行为。 - Blake Miller
130
在警告信息本身中包含您清晰明了的摘要,而不是指示我们打开文档并搜索字符串,这将会更好得多。 - hertzsprung
120
“文档中已经非常清楚地解释了。” 当然,如果您最终进入正确的页面,那么一切都会很清晰明了。然而,git push 的手册甚至没有提到“简单”这个词,这可能就是为什么有那么多人最终来到了这里的原因。 - Gerry
36
Hammar的总结比Git文档更加简洁易懂。 - AJ.
显示剩余14条评论

19

我知道这篇文章很旧,但是由于我刚刚遇到了同样的问题,并且找不到答案,所以我想添加一些内容。

@hammar的答案是正确的。使用push.default simple可以像配置分支跟踪一样,当推送和拉取时不需要指定远程和分支。 matching选项将所有分支推送到它们在默认远程存储库上对应的分支(除非您已经配置存储库)。

希望其他人在将来会发现有用的一点是,我在OS X Mountain Lion上运行Git 1.8时从未看到过这个错误。升级到Mavericks后突然出现了这个问题(运行git --version将显示git version 1.8.3.4 (Apple Git-47),这是我直到更新操作系统之前从未见过的版本)。


2
我在升级到Mavericks后也开始遇到这个问题。所以我猜Git也是在同一时间与Mavericks一起升级的,就像你所暗示的那样。 - Per Lundberg

8
如果你收到git的消息,抱怨配置中"simple"这个值的话,请检查你的git版本。在升级Xcode(在运行Mountain Lion的Mac上)后,git也会被从1.7.4.4升级到1.8.3.4,之前已经运行的shell仍在使用git 1.7.4.4,会因为全局配置中push.default的值为"simple"而出现问题。解决方法是关闭运行旧版本的git的shell,使用新版本即可。

13
我使用的是全新的Xcode安装(git版本为1.8.5.2),即使如此,我仍然遇到了这个错误,直到我运行了以下命令:git config --global push.default simple - Sam-Graham

2
我在Ubuntu 16.04(预装Git 2.7.4)上看到一个大警告信息,但在Arch Linux上没有。原因是该警告已于2016年3月的Git 2.8中被移除了。如下所述:

在Git版本2.0左右的过渡期间,如果用户运行“git push”而没有设置push.default配置变量,就会收到相当响亮的警告。我们不再发出警告,因为过渡已经完成很长时间了。

因此,如果您使用Git 2.8或更高版本,则不会看到警告,并且不需要设置push.default,除非您想更改默认的'simple'行为。

0

从其他可能会关闭为重复的线程中转移了我的答案...

来自GIT文档:Git Docs

以下提供了完整的信息。简而言之,simple仅推送当前工作分支,并且仅在远程具有相同名称时才这样做。对于初学者来说,这是非常好的设置,并将成为GIT 2.0的默认设置

matching将本地所有与远程相同名称的分支一起推送(不考虑您当前的工作分支)。这意味着可能会推送许多不同的分支,包括您可能不想共享的分支。

在我的个人使用中,我通常使用不同的选项:current,它会推送当前工作分支(因为我总是为任何更改创建一个新分支)。但对于初学者,我建议使用simple

push.default
定义了当没有明确给出refspec时,git push应该采取的操作。不同的值适用于特定的工作流程;例如,在纯中央工作流程中(即提取源等于推送目标),上游可能是您想要的。可能的值包括:
nothing - 除非明确给出refspec,否则不要推送任何内容(错误输出)。这主要是为那些希望始终明确避免错误的人准备的。
current - 推送当前分支以更新接收端上具有相同名称的分支。在中央和非中央工作流程中均可使用。
upstream - 将当前分支推回通常集成到当前分支中的更改的分支(称为@{upstream})中。仅当您将要推送到与您通常从中拉取的存储库相同时,此模式才有意义(即中央工作流程)。
simple - 在集中式工作流程中,像上游一样工作,并添加了一个安全功能,以拒绝推送上游分支名称与本地分支名称不同的情况。
当推送到与您通常从中拉取的远程不同的远程时,按照当前方式工作。这是最安全的选项,适合初学者。
此模式将成为Git 2.0的默认模式。
matching - 推送两端具有相同名称的所有分支。这使您要推送到的存储库记住将被推出的分支集(例如,如果您总是在那里推送maint和master,并且没有其他分支,则您要推送到的存储库将具有这两个分支,而您的本地maint和master将被推送到那里)。
要有效使用此模式,您必须确保在运行git push之前准备好要推出的所有分支,因为此模式的整个重点是允许您一次性推出所有分支。如果您通常只完成一个分支上的工作并推出结果,而其他分支尚未完成,则此模式不适合您。此模式也不适用于推送到共享中央存储库,因为其他人可能会在那里添加新分支,或者更新您无法控制的现有分支的提示。
这是当前的默认设置,但Git 2.0将把默认设置更改为simple。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接