git - 推送电流与推送上游(跟踪)

时间:2012-12-06 19:46:50

标签: git

我已经阅读了关于push命令的git man,但我仍然不明白 push中设置的 current upstream 之间的确切区别.DEFAULT

我希望我们的团队能够进行推送,并且只会推动他们当前正在处理的分支上的更改。 据我所知,当我做 git branch 时,这个分支是用*(星号)标记的分支。

感谢您提供帮助。

2 个答案:

答案 0 :(得分:46)

问题是你在推什么,而到哪里

  • current

    • what ”只是您当前的分支(没有其他分支),
    • to where ”是 upstream repo 中同名的分支(如果不存在,则创建)。
  • <强> upstream

作为explained here,Git2.0还会为push.default引入新的默认值: simple

simple upstream 类似,但上游必须具有相同的名称,否则推送将失败。


只推送一个分支(模式为“simple”,“current”或“upstream”)可以避免the scenario推送所有匹配的分支(模式“ matching“,这是很长时间的默认值”,即使你的某些分支可能还没有准备好被推送。

(master)> git push
...
To git@github.com:jkubicek/my_proj.git
   21b430d..dd378ca  master -> master
 ! [rejected]        release -> release (non-fast-forward)
error: failed to push some refs to 'git@github.com:jkubicek/my_proj.git'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. 
hint: If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration
hint: variable to 'current' or 'upstream' to push only the current branch.

两者之间的区别(currentupstream)位于(从遥控器拉到你的分支的什么?):

  • 推送“current”并不意味着您当前的分支Bremote/B有其上游分支。
    即:当你推动“branch.B.merge”分支时,current未设置 即:当拉到B时,git将不知道要拉什么分支。

  • 推送“upstream”表示您当前的分支Bremote/B有其上游分支。
    即:当你推动“branch.B.merge”分支时,设置upstream 。 即:当拉到B时,git知道要拉的分支(以及哪个远程仓库:branch.B.remote

答案 1 :(得分:2)

push.default最好在git config(man git config)的手册页中介绍。

要理解push.default的“上游”和“当前”之间的区别,您应该知道上游一词:

Upstream是从普通本地分支到本地远程跟踪分支的本地指针。 (是的,这些都是本地的。)例子:

  • branch blabla origin / blabla 配置为上游(非常常见)
  • branch blabla origin / foo 作为上游(分支有不同的本地名称;不常见)
  • branch blabla origin2 / foo 作为上游

请注意, origin / * 分支是本地的,并且在每次从原点获取时(重新)设置。这些被称为“本地远程跟踪分支”。它们代表最后一次获取时远程“origin”上分支的状态。

每个(普通)本地分支都可以配置上游,但这不是必须的:上游关系的配置只是为了方便某些git命令!

例如,如果您执行git status,git会告诉您“如果它知道上游,那么x提交在后面/前面”(因此git可以与之比较)。

正常的初始git checkout blabla通常为您设置上游配置(如果origin / blabla存在,则检出并设置为上游 - 否则结帐失败)。

git push也可以使用分支的上游配置,即将新提交复制到代表上游的远程分支。 (这是push.default = upstream。)

push.default = current允许git push将新提交复制到同名的远程。它完全忽略了上游配置。 - 如果您的本地分支名称始终与远程分支名称相同,则两个配置都具有相同的效果,但git push push.default = upstream *将失败,如果尚未配置上游。

PD:是的,git branch输出中的{{1}}显示当前分支。