git push.default = current和push.default = upstream有什么区别?


89

git-config的手册页列出了push.default的以下选项:

nothing - do not push anything.
matching - push all matching branches. All branches having the same name in both ends are considered to be matching. This is the default.
upstream - push the current branch to its upstream branch.
tracking - deprecated synonym for upstream.
current - push the current branch to a branch of the same name.

在大多数情况下,我认为推送到分支的上游分支与推送到相同名称的分支是相同的,因为上游分支通常具有相同的名称,并且由于分支的名称相同(“当前” )通常(或根据定义始终是?)位于上游。那有什么区别呢?

UPDATE为的git-config中的男子页面已经更新(如人们所期望的),这样的区分做出可能是一个更加清晰了。


2
对于开发人员来说,区别这些确实很烦人,因此引入了“简单”,它将成为git-push的默认行为。实际上它出现在git
1.7.11中

14
有关最近的git警告push.default is unset; its implicit value is changing in Git 2.0以及matching与vs的更多信息,simple请参见stackoverflow.com/questions/13148066/…–
Nate

iconoclaust:我认为我的编辑根本不会改变问题的完整性,只需要修复过时的信息即可。为什么要让用户做点击链接的额外工作?
Flimm 2013年

Answers:


72

您已经总结了问题的不同之处。upstream推送到已配置的上游分支,同时current假定上游分支与当前本地分支具有相同的名称,并推送到该特定名称。实际上,没有理由假设本地分支的上游跟踪分支与本地分支本身具有相同的名称。

例如,如果您在多个存储库中或在多个共享的开发人员远程中工作,则通常最终会跟踪同一分支的不同分支,例如allen-mastersusan-master,这两个master分支都分别跟踪Allen和Susan的回购协议中的分支。在这种情况下,current这将是不正确的设置,因为这些分支名称在其遥控器上不存在。upstream但是,效果很好。

一个更实际的示例可能是同时跟踪developmentproduction存储库。您的工作流程可能会为每个工作流使用不同的主线分支,但这可能会造成混淆。假设您是代码集成商,并且想分别跟踪两个存储库的master分支。

git checkout -b production --track production/master
git checkout -b development --track development/master

现在,您有两个分支来跟踪各自的存储库,两个分支都不使用master命名约定。分支名称几乎没有什么混淆:它们明确描述了它们跟踪的内容。不过,push.default = current这是没有任何意义的,因为远程都不包含adevelopmentproductionbranch。


6
您将给出两个示例,说明何时upstream首选current。我认为这很明显,因此您应该为相反的情况举一个例子。
AndreKR 2013年

1
@AndreKR AFAIKcurrent在您是新手开发人员的情况下会更好,因为您不需要git config太多,尤其是从某个地方克隆后。如果还不存在,则在您current的远程存储库上推送或创建到同名分支,然后在同名分支不存在时立即拒绝这样做。在这种情况下具有相同的行为,除非已按照Yawar的答案明确设置或以其他方式设置了上游分支。simpleupstream
很少“莫妮卡在哪里”有需要的人2015年

6

current 将当前分支推送到远程仓库上具有相同名称的分支。

upstream 将当前分支推到上游分支。

上游分支是已明确或隐式定义为当前分支上游的分支。这意味着默认情况下,推和拉将与此分支同步。上游分支可能与当前分支本身在同一存储库中。您可以做一些有趣的事情,例如将本地主分支设置为本地功能(主题)分支的上游,并在它们之间进行推拉。

隐式上游设置是通过branch.autosetupmergeconfig值完成的。您可以在git config帮助页面中找到文档。显式上游设置是通过命令-u选项完成的git branch。有关详细信息,请参见帮助页面。


branch.autoSetupMerge认为与-u/的想法不同--set-upstream。至少,我没有在文档中看到任何暗示它使git push表现为-u默认调用的行为,这对我来说似乎是对的。您能说明您的意思吗?
waldyrious

@waldyrious当然; 当您签出远程跟踪分支时,branch.autoSetupMerge默认情况下,配置会创建一个新的本地分支并将其上游设置为远程跟踪分支。可以通过使用-t--track)或-u ...--set-upstream-to=...)标志来显式地执行此隐式操作,这两个标志在语法稍有不同的情况下会执行相同的操作。
Yawar

1
我知道这里发生了什么—由于这个问题是关于git push,我(错误地)认为您是在谈论的-u选择git push,而不是的-u选择git branch。很抱歉的混乱:)
waldyrious
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.