37

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

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

感谢您的帮助。

4

2 回答 2

56

问题是你在推动什么,以及哪里

  • current

    • 什么”只是你当前的分支(没有其他分支),
    • to where ” 是上游 repo中同名的分支(如果不存在则创建)。
  • upstream

    • what ”也只是当前分支,
    • 到哪里”是上游仓库上的任何分支(不一定同名)已被分配为您正在推送的本地分支的上游分支。

正如这里所解释的,Git2.0 将另外引入一个新的默认值push.defaultsimple

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


只推送一个分支(使用模式“ simple”、“ current”或“ upstream”)避免所有匹配的分支都被推送的情况(模式“ 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)之间的区别在于拉取(从远程拉取什么到您的分支?):

  • push " current" 并不意味着你当前的分支Bremote/B它的上游分支。
    即:branch.B.merge未设置,当您推动“ current”分支时。
    即:当拉到 时B,git 不知道要拉哪个分支。

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

于 2012-12-06T20:20:19.183 回答
7

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

要了解 的“上游”和“当前”之间的区别push.default,您应该知道术语上游

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

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

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

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

例如,如果你做一个git status例子,如果 git 知道上游,它会告诉你“x commits behind/ahead”(所以 git 可以与它​​进行比较)。

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

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

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

PD:是的,*在输出中git branch显示了当前分支。

于 2015-04-01T13:15:04.277 回答