TL; DR: git branch --set-upstream-to origin/solaris
这个问题的答案你问哪个,我会改写一个部位为“我要设置一个上游” -is的问题:不,你不具备在所有设置的上游。
但是,如果当前分支没有上游,则Git会在git push
和其他命令上更改其行为。
完整的推送故事漫长而无聊,其历史可以追溯到Git 1.5版之前。将其整体缩短很多,git push
实施效果不佳。1 从Git 2.0版开始,Git现在有一个拼写的配置旋钮push.default
,现在默认为simple
。对于2.0之前和之后的多个版本的Git,每次运行时git push
,Git都会发出很多噪音,试图说服您进行设置push.default
以git push
使其闭嘴。
您没有提到您正在运行哪个版本的Git,也没有提及您是否已配置push.default
,因此我们必须猜测。我的猜测是您使用的是Git版本2点功能,并且已经准备push.default
好simple
将其关闭。正是你有哪些的Git版本,如果有什么事情,你都push.default
设置为,做的事情,因为那漫长而枯燥的历史,但最终的事实,你要还来自另一个Git的投诉表明你的Git 是配置为避免过去的错误之一。
什么是上游?
的上游仅仅是另一个分支名称,通常是一个远程跟踪分支,具有(常规,本地)分支相关联。
每个分支都可以选择一(1)个上游集合。也就是说,每个分支都具有上游,也可以不具有上游。没有分支可以有一个以上的上游。
上游应该但不是必须是有效分支(无论是远程跟踪like 还是本地like )。也就是说,如果当前分支B具有上游U,则应该起作用。如果它不起作用-如果它抱怨U不存在-那么大多数Git的行为就好像根本没有设置上游。一些命令(如)将显示上游设置,但将其标记为“ gone”。origin/B
master
git rev-parse U
git branch -vv
上游有什么好处?
如果将your push.default
设置为simple
或upstream
,则上游设置将make git push
,不使用其他参数,就可以了。
就这样-这就是它所做的全部git push
。但这是相当重要的,因为这git push
是简单的错字引起严重头痛的地方之一。
如果您push.default
将设置为nothing
,matching
或current
,则设置上游根本不起作用git push
。
(所有这些都假设您的Git版本至少为2.0。)
上游影响 git fetch
如果git fetch
没有其他参数运行,Git会通过咨询当前分支的上游来确定从哪个远程获取。如果上游是远程跟踪分支,则Git从该远程获取。(如果上游未设置或是本地分支,则Git尝试获取origin
。)
上游影响git merge
和git rebase
太
如果您运行git merge
或git rebase
没有其他参数,则Git使用当前分支的上游。因此,它缩短了这两个命令的使用。
上游影响 git pull
无论如何,您永远都不应使用2git pull
,但如果这样做,则应git pull
使用上游设置来确定要从中获取哪个远程,然后与之合并或变基的分支。也就是说,git pull
做同样的事情git fetch
-因为它实际上运行 git fetch
-然后做同样的事情,git merge
或者git rebase
,因为它实际上运行 git merge
或git rebase
。
(通常,您通常应该手动执行这两个步骤,至少直到您对Git的了解足够深,以至于当任一步骤失败时,他们最终都会知道出了什么问题并知道该怎么做。)
上游影响 git status
这实际上可能是最重要的。一旦有了上游集,git status
就可以报告当前分支与其上游分支之间的差异。
如果正常情况下,如果您在B
其上游设置为的分支上并且运行,您将立即看到您是否具有可以推送的提交,和/或可以合并或基于其的提交。origin/B
git status
这是因为git status
运行:
git rev-list --count @{u}..HEAD
:有多少提交你对B
那些不上?origin/B
git rev-list --count HEAD..@{u}
:有多少提交你对那些不上?origin/B
B
设置上游将为您提供所有这些东西。
为什么master
已经有了上游产品呢?
首次从某个远程克隆时,请使用:
$ git clone git://some.host/path/to/repo.git
或类似的操作,Git所做的最后一步本质上是git checkout master
。此检查出你的本地分支master
-只有你没有拥有一个本地分支master
。
另一方面,您确实有一个名为的远程跟踪分支origin/master
,因为您只是克隆了它。
Git的猜测,你一定意味:“让我一个新的地方master
,它指向同一个commit,远程跟踪origin/master
,并且,当你在它,设定为上游master
来origin/master
。”
对于尚未拥有的每个分支都会发生这种情况git checkout
。Git创建分支,并使它“跟踪”(作为上游)相应的远程跟踪分支。
但是,这并不工作,为新的分支,即没有远程跟踪支支还没有。
如果创建新分支:
$ git checkout -b solaris
到目前为止,还没有origin/solaris
。您的本地solaris
无法跟踪远程跟踪分支,origin/solaris
因为它不存在。
首次推送新分支时:
$ git push origin solaris
这造成 solaris
的origin
,因此也创造origin/solaris
你自己的Git仓库。但为时已晚:你已经有一个地方solaris
是没有的上游。3
Git现在不应该将其自动设置为上游吗?
大概。请参阅“执行不力”和脚注1。这是很难改变现在:有几百万4使用Git的脚本和一些可能取决于其当前行为。更改行为需要新的主要发行版,使用nag-ware强制您设置某些配置字段等。简而言之,Git是其自身成功的受害者:今天,它所犯的任何错误只有在这种变化大部分是不可见的,明显好得多的或者随着时间的推移而缓慢完成时才能解决。
事实是,除非您在--set-upstream
或-u
期间使用,否则今天不会git push
。这就是消息告诉您的内容。
您不必那样做。好吧,正如我们上面提到的,您根本不需要这样做,但是假设您想要上游。你已经创建的分支solaris
上origin
,通过早期的推动,并作为你的git branch
输出显示,你已经有 origin/solaris
在本地资源库。
您只是没有将它设置为的上游solaris
。
现在就进行设置,而不是在第一次按下时进行设置git branch --set-upstream-to
。该--set-upstream-to
子命令采用任何现有分支的名称,例如origin/solaris
,并将当前分支的上游设置为该其他分支。
就这样-就是这样-但是它具有上面提到的所有含义。这意味着您可以先运行git fetch
,然后环顾四周,然后运行git merge
或git rebase
根据需要运行,然后进行新的提交并运行git push
,而无需进行很多额外的操作。
1公平地说,当时还不清楚最初的实现是否容易出错。只有每个新用户每次都犯相同的错误时,这一点才变得清楚。现在已经“不那么贫穷”了,更不用说“伟大”了。
2 “从不”是一个有点强,但我发现,Git的新手明白了很多东西更好,当我分离出的步骤,特别是当我可以告诉他们什么git fetch
实际上做了,然后就可以看到什么git merge
或git rebase
下一个会做。
3如果您以第一个 git push
身份(即git push -u origin solaris
添加-u
标志)运行,则Git将origin/solaris
在(且仅当)推送成功的情况下设置为当前分支的上游。因此,您应该-u
在首次推送时提供。实际上,您可以在以后的任何推送中提供它,并且它将在该点设置或更改上游。但是git branch --set-upstream-to
,如果您忘记了,我认为会更容易。
4用Austin Powers / Evil博士的方法来衡量,无论怎么说,该方法只是简单地说“一个米尔”。