从最近开始,我的分支机构现在默认跟踪并推送到远程主服务器,即使我git push -u origin branch_name
,即使我使用matching
作为我的{{} 1}}选项。
push.default
此外,如果我为# --------
# STEP 1
# --------
$ git checkout -b my_branch
Branch my_branch set up to track local branch master.
Switched to a new branch 'my_branch'
# --------------------------------------------------------------------------------
# STEP 2: (same behavior BTW with current/upstream/simple)
# --------------------------------------------------------------------------------
$ git config --global push.default matching
# --------
# STEP 3:
# --------
$ 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.
尝试以下操作,则会收到错误消息:
STEP 2
我知道我可以手动修改$ git branch --set-upstream-to=origin/my_branch
error: the requested upstream branch 'origin/my_branch' does not exist
hint:
hint: If you are planning on basing your work on an upstream
hint: branch that already exists at the remote, you may need to
hint: run "git fetch" to retrieve it.
hint:
hint: If you are planning to push out a new local branch that
hint: will track its remote counterpart, you may want to use
hint: "git push -u" to set the upstream config as you push.
,但为什么不能完成上述工作?
.git/config
答案 0 :(得分:4)
这个位是可疑的,因为中间线不应该出现:
$ 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'
请注意缺少上游设置。 我的猜测是你的 编辑:原来是因为你&#39 ; d将gco
别名或脚本在其中有--track
。branch.autoSetupMerge
配置为always
,因此从本地分支创建的新分支会跟踪其本地分支。
这只是问题的一半,但如果没有发生这种情况,那么无论如何都不会发生完整的问题。因此,一个修复是删除该设置(默认似乎是大多数人最想要的)。
解决问题的另一半:
$ git branch --set-upstream-to=origin/my_branch error: the requested upstream branch 'origin/my_branch' does not exist
问题 here 就像Git所说的那样:origin/my_branch
不存在。好吧,它还不存在尚未:你需要说服你的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
(不是origin/master
,只有master
),你的Git要求其他Git使用名称master
,就好像你已经运行:
git push origin my_branch:master
由于此git push
没有其他任何问题,他们的一方会按照您的一方的要求设置他们的 master
以匹配您的my_branch
- 然后您的身边会使用-u
执行您所要求的操作,即将上游设置从master
更改为origin/master
。当然,这不是你的意思。
(而且:当你的Git在master
替换本地 master
时,似乎有点邪恶,即branch.my_branch.remote
只是.
,而不是origin
。但假设我们无法改变Git本身......)
我认为有三种简单的方法可以解决这个问题:
使用明确的远程端名称:git push -u origin my_branch:my_branch
。这将覆盖当前的上游设置,以便您的Git要求他们的Git写入my_branch
。如果成功 - 应该 - 您的Git现在将origin/my_branch
,并将my_branch
的上游设置更改为origin/my_branch
。
这里的一个缺点是如果推送失败,你的Git不会改变当前的上游设置。当然,对git push -u
来说这是正确的(包括接下来的两种方法,但在这两种情况下,未来不会留下任何陷阱)。
在运行git push
:git branch --unset-upstream my_branch
(或任何等效内容,包括编辑.git/config
文件)之前,明确删除当前上游设置。既然上游没有,你的Git不会要求他们的Git使用名称master
。
一旦你的Git要求他们的Git在my_branch
上创建master
(而不是origin
),我们就会回到第一种方法会发生的事情。
首先避免将本地master
设置为上游。效果与方法2相同。
一种硬方法是伪造你的Git:你可以创建一个远程跟踪分支,而无需实际转到远程。要做到这一点,你将不得不使用"管道"命令git update-ref
,而不是git branch
。但是,如果这样做,则可以在实际创建远程分支的推送之前使用--set-upstream-to
。 (另一个难的方法是您直接编辑.git/config
或使用git config
执行等效的技巧。这允许您将上游设置为尚未真正存在的内容,因为所有Git在这里真正做的是存储名称。)