Git-push.default“匹配”和“简单”之间有什么区别


285

我已经使用git一段时间了,但是我从来没有自己设置过一个新的远程仓库,我对此一直很好奇。我一直在阅读教程,但对如何使“ git push”工作感到困惑。

如果我只是简单地使用git push它,则要求我查看要指向的默认分支(?)。它为我提供的这两种选择之间有什么区别?

git config --global push.default matching
git config --global push.default simple

匹配只会推送我在本地存储库中拥有的任何分支,如果它们不匹配,我就必须手动告诉它推送任何我拥有的新本地分支,对吗?使用的是最佳实践还是简单的最佳实践?



1
现在,如果仅pull.default可用于在本地更新所有这些分支机构
Nogurenn

Answers:


367

git push 可以根据此配置推送所有分支或单个分支:

推所有分支

git config --global push.default matching

它将所有分支推送到远程分支并合并它们。如果您不想推送所有分支,则只能推送当前分支。

仅推送当前分支

git config --global push.default simple

因此,我认为最好使用此选项并逐个分支推送代码。最好手动和单独推送分支。


16
我喜欢push.default current@UpAndAdam的答案。不知道这件事。
alanjds

4
请注意,这simple不再是一个选择。在1.7.8.4(或更早的版本?)中,当您尝试推送时会导致错误。但current仍可用
Sixty4bit

@ sixty4bit:我正在使用git版本1.7.1。我正在使用tracking->将当前分支推到其上游分支。
kevinarpe

@ sixty4bit不,它包含在更高版本的Git中,我不知道该版本是哪一个,但(1.7)仍然是地狱般的,即使对于2016年也是如此。我不建议使用这样的旧版本。
Schmoudi

不赞成投票。抱歉,但是链接页面的描述simple没有意义,与该答案矛盾,并且不正确-这使该答案令人困惑。链接的页面显示simple“将一一推送分支。主要与当前分支连接”。这是否意味着它将顺序推动分支而不是并行推动分支?“大多数情况下连接”是什么意思?然后,对的描述simple继续引用对的描述matching,人们会认为的描述matching也适用于simple。但是显然那是不正确的。
tvanc

91

从GIT文档中:Git Docs

下面提供了完整的信息。简而言之,simple只有current working branch在遥控器上也具有相同名称的情况下,才会推送和,甚至推送。对于初学者来说,这是一个很好的设置,它将成为GIT 2.0

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

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

push.default
定义如果未明确给出refspec,则git push应该执行的操作。不同的值非常适合特定的工作流程;例如,在纯粹的中央工作流程中(即,获取源等于推送目的地),上游可能就是您想要的。可能的值为:

什么都不做-除非明确给出refspec,否则不要推送任何内容(错误)。这主要是针对那些希望始终保持露骨以避免错误的人。

当前-推送当前分支以在接收端更新具有相同名称的分支。在中央和非中央工作流程中均可使用。

上游-将当前分支推回到通常将其更改集成到当前分支中的分支(称为@ {upstream})。仅当您推送到通常从中提取的同一存储库(即中央工作流)时,此模式才有意义。

简单-在集中式工作流程中,如果上游分支机构的名称与本地分支机构不同,则可以像上游那样工作,并增加了安全性,可以拒绝推送。

当推入与您通常从中拔出的遥控器不同的遥控器时,请以当前方式工作。这是最安全的选择,适合初学者。

该模式将成为Git 2.0中的默认模式。

匹配-在两端推送具有相同名称的所有分支。这使您要推送的存储库记住将要推出的分支集(例如,如果您始终将maint和master推送到那里,而没有其他分支,则推送到的存储库将具有这两个分支,以及本地的maint和master将被推到那里)。

为了有效地使用此模式,必须确保在运行git push之前已准备好将要推出的所有分支都推出,因为此模式的要点是允许您一次推送所有分支。如果通常只在一个分支上完成工作并推出结果,而其他分支还没有完成,则此模式不适合您。同样,此模式也不适合推送到共享中央存储库中,因为其他人可能会在其中添加新分支,或在控件外部更新现有分支的尖端。

当前是默认设置,但是Git 2.0会将默认设置更改为simple。


是的,但是我假设即使使用push.default设置,如果您执行“ $ git push origin master ”,它也只会将当前分支推送到origin上具有相同名称的分支上...对吗?您应该指出,也有一个默认的远程
亚历山大·米尔斯

1
我不确定我了解您的意思。如果您说在任何模式下,git push origin master它都会做同样的事情。模式和默认值的要点通常是当您简单地说git push而不告诉它是远程还是分支时发生的事情。什么是默认设置?您的意思是push.default的默认设置?git版本的默认设置...如果不明白,您的评论将非常含糊。
UpAndAdam

'push.default定义了在没有显式给出refspec的情况下git push应该执行的操作',如果您说git push origin master则向其提供了更多信息,但它可能仍无法执行您描述的操作;取决于您设置的refspec。.git
scm.com/

2

Git v2.0发行说明

向后兼容性说明

何时git push [$there]不说要推送什么,到目前为止,我们已经使用了传统的“匹配”语义(只要您的分支已经发送到远程,只要那里已经有相同名称的分支)即可。在Git 2.0中,默认值现在是“简单”语义,它推送:

  • 仅当当前分支设置为与该远程分支集成时,才将当前分支分支到具有相同名称的分支;要么

  • 如果您要推送到通常不是从那里获取的远程站点,则仅将当前分支转移到具有相同名称的分支。

您可以使用配置变量“ push.default”进行更改。例如,如果您想继续使用“匹配”语义,可以将变量设置为“匹配”。阅读文档以了解其他可能性。

git add -ugit add -A在子目录中运行而未指定要在命令行上添加哪些路径时,它们将在整个树上操作,以git commit -a与其他命令保持一致(这些命令仅用于当前子目录)。说,git add -u .或者git add -A .是否要将操作限制在当前目录。

git add <path>git add -A <path>现在相同,因此 git add dir/将注意到您从目录中删除的路径并记录该删除。在旧版Git中,git add <path>用于忽略删除。如果确实要,您可以说git add --ignore-removal <path>仅在中添加添加或修改的路径<path>

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.