这一点很可疑,因为中间的线不应该出现:
$ git checkout -b my_branch
Branch my_branch set up to track local branch master.
Switched to a new branch 'my_branch'
例如,当我这样做时git checkout -b foo
在存储库中:
$ git checkout -b foo
Switched to a new branch 'foo'
Note the lack of an upstream setting. My guess is that your gco
alias-or-script has --track
inside it somewhere. Edit: This turns out to be because you'd configured branch.autoSetupMerge
to always
, so new branches created from local branches track their local branch.
这只是问题的一半,但如果这没有发生,完整的问题就不会发生。因此解决方法之一是删除该设置(默认值似乎是大多数人最想要的)。
解决问题的另一半:
$ git branch --set-upstream-to=origin/my_branch
error: the requested upstream branch 'origin/my_branch' does not exist
问题here这正是 Git 所说的:origin/my_branch
不存在。嗯,它不存在yet:你需要说服你的 Git 有一个origin/my_branch
。 Git 就是 Git,有很多方法可以做到这一点,但可能是最好的方法,我们稍后会介绍。
$ git push -u origin my_branch
Counting objects: 8, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (8/8), done.
Writing objects: 100% (8/8), 1.16 KiB | 0 bytes/s, done.
Total 8 (delta 7), reused 0 (delta 0)
To XX:YYY/my_repo
62d390c..4e4baa1 my_branch -> master
Branch my_branch set up to track remote branch master from origin.
这就是事情出错的地方:因为my_branch
已经有一个上游设置master
(not origin/master
, just master
),你的 Git 要求其他 Git 使用该名称master
,就好像您运行了:
git push origin my_branch:master
因为这没有其他问题git push
,他们这边按照你那边的要求做——设置their master
来匹配你的my_branch
——然后你方按照你的要求去做-u
,即将上游设置更改为master
to origin/master
。那不是你meant当然要问。
(而且:用你的 Git 来代替似乎有点邪恶master
当那是一个local master
, i.e., branch.my_branch.remote
只是.
, not origin
。但假设我们无法改变 Git 本身......)
我看到三种简单的方法可以解决这个问题:
-
使用显式的远程端名称:git push -u origin my_branch:my_branch
。这会覆盖当前的上游设置,以便您的 Git 要求其 Git 写入my_branch
。如果成功了——应该成功了——你的 Git 现在将拥有origin/my_branch
并将更改您的上游设置my_branch
to origin/my_branch
.
这里的一个缺点是,如果推送失败,您的 Git 不会更改当前的上游设置。当然,这对于一般情况来说是正确的git push -u
(包括接下来的两种方法,但是在这两种情况下,不会为未来留下任何陷阱)。
-
明确地delete运行之前的当前上游设置git push
: git branch --unset-upstream my_branch
(或任何等效的内容,包括编辑.git/config
文件)。既然没有现有的上游,你的 Git 不会要求他们的 Git 使用该名称master
.
一旦你的 Git 要求他们的 Git 创建my_branch
(而不是master
) on origin
,我们回到第一种方法发生的情况。
避免设置您的本地master
首先作为上游。效果与方法2相同。
One hard做到这一点的方法是伪造你的 Git:你可以创建一个远程跟踪分支,而无需实际访问远程。为此,您必须使用“plumbing”命令git update-ref
, 而不是git branch
。如果你这样做了,那么你可以使用--set-upstream-to
在实际在远程创建分支的推送之前。 (另一个困难的方法是你使用的编辑技巧.git/config
直接,或者做同样的事情git config
。这允许你将上游设置为尚不存在的东西,因为 Git 在这里真正做的就是存储names.)