为什么我必须“我必须”;git push——设置上游原点<;分行>&引用;?

为什么我必须“我必须”;git push——设置上游原点<;分行>&引用;?,git,branch,Git,Branch,我创建了一个本地分支来测试Solaris和Sun Studio。然后我把树枝往上游推。提交更改并尝试推送更改后: $ git commit blake2.cpp -m "Add workaround for missing _mm_set_epi64x" [solaris 7ad22ff] Add workaround for missing _mm_set_epi64x 1 file changed, 5 insertions(+) $ git push fatal: The current

我创建了一个本地分支来测试Solaris和Sun Studio。然后我把树枝往上游推。提交更改并尝试推送更改后:

$ git commit blake2.cpp -m "Add workaround for missing _mm_set_epi64x"
[solaris 7ad22ff] Add workaround for missing _mm_set_epi64x
 1 file changed, 5 insertions(+)
$ git push
fatal: The current branch solaris has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin solaris
为什么我要为此做些特别的事

是否存在任何合理的用例,其中有人会创建
,将
推到远程,然后声明
上的提交不适用于


我遵循了关于堆栈溢出的问题和答案:。我猜这是另一个不完整或错误的公认答案。或者,这是Git承担简单任务并使其变得困难的另一个例子


这是另一台机器上的视图。分支显然存在,因此创建并推送了它:

$ git branch -a
  alignas
* master
  remotes/origin/HEAD -> origin/master
  remotes/origin/alignas
  remotes/origin/arm-neon
  remotes/origin/det-sig
  remotes/origin/master
  remotes/origin/solaris

基本上完整的命令类似于
gitpush:
。如果只运行
gitpush
,git就不知道该做什么,除非您做了一些配置来帮助git做出决定。在git回购中,我们可以设置多个远程设备。我们还可以将本地ref推送到任何远程ref。full命令是进行推送的最直接的方法。如果你想输入更少的单词,你必须先配置,比如--set upstream。

TL;DR:
git分支--将上游设置为origin/solaris

你问的问题的答案是:不,你根本不需要设置一个上游。我将把这个问题重新表述为“我必须设置上游吗?”

但是,如果当前分支没有上游,Git会在
gitpush
和其他命令上更改其行为

这里完整的推送故事既长又无聊,可以追溯到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-point-something,并且您已将
push.default
设置为
simple
,以使其关闭。确切地说,你拥有哪个版本的Git,以及如果你有任何东西
push.default
设置为,这确实很重要,因为这段漫长而乏味的历史,但最终,你又收到Git的另一个投诉,这表明你的Git被配置为避免过去的一个错误

什么是上游? 上游只是另一个分支名称,通常是远程跟踪分支,与(常规、本地)分支关联

每个分支都可以选择一(1)个上游集。也就是说,每个分支要么有上游,要么没有上游。任何分支都不能有多个上游分支

上游应该(但不一定)是有效的分支(无论是远程跟踪,如
origin/B
,还是本地跟踪,如
master
)。也就是说,如果当前分支B具有上游U,
git rev parse U
应该可以工作。如果它不工作,如果它抱怨U不存在,那么大多数Git的行为就好像根本没有设置上游一样。一些命令,如
git branch-vv
,将显示上游设置,但将其标记为“已消失”

上游有什么好处? 如果您的
push.default
设置为
simple
upstream
,则upstream设置将使
git push
(不使用其他参数)正常工作

这就是git push的全部功能。但这是相当重要的,因为git push是一个简单的打字错误会引起严重头痛的地方

如果您的
push.default
设置为
nothing
matching
,或
current
,则设置上游对
git push
完全没有作用

(所有这些都假设您的Git版本至少为2.0。)

上游影响
git fetch
如果在没有附加参数的情况下运行
git fetch
,git会通过查询当前分支的上游来确定从哪个远程设备进行提取。如果上游是一个远程跟踪分支,Git将从该远程分支获取数据。(如果上游未设置或是本地分支,Git将尝试获取
原点

上游也会影响
git merge
git rebase
如果在没有附加参数的情况下运行
git merge
git rebase
,git将使用当前分支的上游。因此它缩短了这两个命令的使用

上游影响git拉力 无论如何,您都不应该使用
git-pull
,但是如果您使用了,
git-pull
使用上游设置来确定从哪个远程设备获取数据,然后使用哪个分支进行合并或重设基。也就是说,
git pull
执行与
git fetch
相同的操作,因为它实际上运行
git fetch
,然后执行与
git merge
git rebase
相同的操作,因为它实际上运行
git merge
git rebase

(您通常只需手动执行这两个步骤,至少在您对Git了解得足够透彻之前,当任何一个步骤失败时,您最终都会意识到哪里出了问题,并知道该怎么做。)

上游影响git状态 这实际上可能是最重要的。一旦有了上游集合,
git status
就可以报告当前分支与其上游分支在提交方面的差异

如果与正常情况一样,您在分支
B
及其上游
$ git clone git://some.host/path/to/repo.git
$ git checkout -b solaris
$ git push origin solaris
$ git push -u origin
$ git push
git push -u origin <your-local-branch-name>
git push -u origin coffee