91

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.

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

更新 git-config 的手册页已经更新(正如人们所期望的那样),因此现在所做的区别可能更加清晰。

4

2 回答 2

73

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

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

一个更实际的例子可能是同时跟踪 adevelopmentproduction存储库。您的工作流程可能会为每个分支使用不同的主线分支,但这可能会让人感到困惑。假设您是代码集成者,并且想要分别跟踪两个存储库的master分支。

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

现在你有两个分支来跟踪它们各自的存储库,它们都没有使用master命名约定。分支名称几乎没有混淆:它们明确地描述了它们跟踪的内容。然而,push.default = current这没有任何意义,因为遥控器都不包含一个developmentproduction分支。

于 2012-08-08T21:23:19.223 回答
7

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

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

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

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

于 2013-05-12T08:11:57.200 回答