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

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

我显然可以将其设置为上述值之一,但它们意味着什么?简单和搭配有什么区别?

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


当前回答

把我的答案从另一个可能会重复的线程中传过来。。。

来自GIT文档:GIT文档

以下是完整信息。简而言之,simple只会推送当前的工作分支,即使如此,也只会在远程上具有相同的名称。对于初学者来说,这是一个非常好的设置,并将成为GIT 2.0的默认设置

而匹配将在本地推送远程上具有相同名称的所有分支。(不考虑您当前的工作部门)。这意味着可能会推送许多不同的分支,包括您甚至不想共享的分支。

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

推送故障定义如果没有refspec,git push应该采取的操作明确给出。不同的值非常适合特定的工作流;例如,在纯粹的中心工作流(即获取源等于推送目的地),上游可能是你想要的。可能的值包括:nothing-除非refspec是明确给出。这主要是针对那些想要避免总是明确地犯错误。current-推送当前分支以使用该分支更新分支接收端的名称。在中央和非中央工作工作流。upstream-将当前分支推回到其更改的分支通常集成到当前分支(称为@{upstream})。只有当您按下您通常会从相同的存储库中提取(即中央工作流)。简单-在集中式工作流中,像上游一样工作,添加如果上游分支机构的名称不同,则拒绝推送的安全性来自本地的。当按下与遥控器不同的遥控器时正常情况下,作为电流工作。这是最安全的选择适合初学者。此模式将成为Git2.0中的默认模式。matching-在两端推送具有相同名称的所有分支。这使存储库记住分支集合将被推出(例如,如果您总是推出maint和master没有其他分支,您推送到的存储库将具有这两个分支,您的本地maint和master将被推送在那里)。要有效地使用此模式,必须确保所有分支在运行git push之前,您将被推出,因为此模式的要点是允许您树枝一气呵成。如果你通常只完成一个分支的工作当其他分支未完成时,此模式为不适合你。此外,此模式不适合推入共享中央存储库,因为其他人可能会在那里添加新的分支,或者更新您控制之外的现有分支的提示。这是当前的默认值,但Git 2.0会将默认值更改为易于理解的

其他回答

我想知道为什么我在Ubuntu 16.04(Git 2.7.4附带)上收到了这个警告消息,而在Arch Linux上却没有。原因是Git 2.8(2016年3月)中删除了警告:

在Git2.0版本的过渡过程中,用户习惯于在没有设置的情况下运行“gitpush”时,会收到一个非常响亮的警告push.default配置变量。我们不再发出警告,因为过渡很早以前就完成了。

因此,如果您有Git 2.8及更高版本,则不会看到警告,并且不需要设置push.default,除非您想更改默认的“简单”行为。

把我的答案从另一个可能会重复的线程中传过来。。。

来自GIT文档:GIT文档

以下是完整信息。简而言之,simple只会推送当前的工作分支,即使如此,也只会在远程上具有相同的名称。对于初学者来说,这是一个非常好的设置,并将成为GIT 2.0的默认设置

而匹配将在本地推送远程上具有相同名称的所有分支。(不考虑您当前的工作部门)。这意味着可能会推送许多不同的分支,包括您甚至不想共享的分支。

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

推送故障定义如果没有refspec,git push应该采取的操作明确给出。不同的值非常适合特定的工作流;例如,在纯粹的中心工作流(即获取源等于推送目的地),上游可能是你想要的。可能的值包括:nothing-除非refspec是明确给出。这主要是针对那些想要避免总是明确地犯错误。current-推送当前分支以使用该分支更新分支接收端的名称。在中央和非中央工作工作流。upstream-将当前分支推回到其更改的分支通常集成到当前分支(称为@{upstream})。只有当您按下您通常会从相同的存储库中提取(即中央工作流)。简单-在集中式工作流中,像上游一样工作,添加如果上游分支机构的名称不同,则拒绝推送的安全性来自本地的。当按下与遥控器不同的遥控器时正常情况下,作为电流工作。这是最安全的选择适合初学者。此模式将成为Git2.0中的默认模式。matching-在两端推送具有相同名称的所有分支。这使存储库记住分支集合将被推出(例如,如果您总是推出maint和master没有其他分支,您推送到的存储库将具有这两个分支,您的本地maint和master将被推送在那里)。要有效地使用此模式,必须确保所有分支在运行git push之前,您将被推出,因为此模式的要点是允许您树枝一气呵成。如果你通常只完成一个分支的工作当其他分支未完成时,此模式为不适合你。此外,此模式不适合推入共享中央存储库,因为其他人可能会在那里添加新的分支,或者更新您控制之外的现有分支的提示。这是当前的默认值,但Git 2.0会将默认值更改为易于理解的

如果您从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并使用新版本。

我意识到这是一篇老帖子,但由于我遇到了同样的问题,很难找到答案,我想我应该补充一点。

所以@hammar的答案是正确的。在某种程度上,使用push.default很简单,就像在分支上配置跟踪,这样在推拉时就不需要指定遥控器和分支。匹配选项会将所有分支推送到默认远程服务器上的对应分支(这是第一个设置的分支,除非您配置了回购协议)。

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

文档中对此进行了详细解释,但我将尝试总结如下:

匹配意味着gitpush会将所有本地分支推送到远程上同名的分支。这使得你很容易不小心推到你不想推的树枝。simple意味着gitpush将只将当前分支推送到gitpull将从中拉出的分支,并检查它们的名称是否匹配。这是一个更直观的行为,这就是为什么默认值会更改为这个。

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