为什么我必须“我必须”;git push——设置上游原点<;分行>&引用;?
我创建了一个本地分支来测试Solaris和Sun Studio。然后我把树枝往上游推。提交更改并尝试推送更改后:为什么我必须“我必须”;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
$ 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