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

ico*_*ast 85 git git-push git-branch

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.
Run Code Online (Sandbox Code Playgroud)

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

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

Chr*_*her 71

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

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

更实际的示例可能是跟踪a developmentproduction存储库.您的工作流可能会为每个分支使用不同的主线分支,但这可能会让您感到困惑.假设您是代码集成商,并希望分别跟踪两个存储库的master分支.

git checkout -b production --track production/master
git checkout -b development --track development/master
Run Code Online (Sandbox Code Playgroud)

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

  • 你给出了两个例子,说明`upstream`比`current`更受欢迎.我认为这很明显,所以你应该为相反的情况举个例子. (6认同)
  • @AndreKR AFAIK `current` 在你是一个新开发者的情况下更好,因为你不需要 `git config` 太多,特别是如果你从某个地方克隆。`current` 推送到或创建然后推送到远程仓库上的同名分支*为您*,如果它们不存在,而当同名分支不存在时,`simple` 将拒绝这样做已经。`upstream` 在这种情况下具有相同的行为,除非已明确设置或以其他方式设置上游分支,如 [Yawar](http://stackoverflow.com/users/20371) 的回答中所述。 (2认同)

Yaw*_*war 6

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

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

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

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

  • 我明白这里发生了什么 - 因为这个问题是关于 `git push` 的,所以我(错误地)假设您正在谈论 `git push` 的 `-u` 选项,而不是 `gitbranch` 的 `-u` 选项。对困惑感到抱歉 :) (2认同)