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

时间:2012-08-08 20:52:23

标签: git git-branch git-push

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.

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

更新 The man page for git-config已更新(正如人们所预期的那样),因此there的区别可能会更加清晰。

2 个答案:

答案 0 :(得分:70)

您已经总结了问题的不同之处。 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没有任何意义,因为两个遥控器都不包含developmentproduction分支。

答案 1 :(得分:6)

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

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

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

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