分支跟踪主人

时间:2016-08-02 21:01:09

标签: git

从最近开始,我的分支机构现在默认跟踪并推送到远程主服务器,即使我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

1 个答案:

答案 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'

请注意缺少上游设置。 我的猜测是你的gco别名或脚本在其中有--track 编辑:原来是因为你&#39 ; d将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本身......)

我认为有三种简单的方法可以解决这个问题:

  1. 使用明确的远程端名称: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来说这是正确的(包括接下来的两种方法,但在这两种情况下,未来不会留下任何陷阱)。

  2. 在运行git pushgit branch --unset-upstream my_branch(或任何等效内容,包括编辑.git/config文件)之前,明确删除当前上游设置。既然上游没有,你的Git不会要求他们的Git使用名称master

    一旦你的Git要求他们的Git在my_branch上创建master(而不是origin),我们就会回到第一种方法会发生的事情。

  3. 首先避免将本地master设置为上游。效果与方法2相同。

  4. 一种方法是伪造你的Git:你可以创建一个远程跟踪分支,而无需实际转到远程。要做到这一点,你将不得不使用"管道"命令git update-ref,而不是git branch。但是,如果这样做,则可以在实际创建远程分支的推送之前使用--set-upstream-to。 (另一个难的方法是您直接编辑.git/config或使用git config执行等效的技巧。这允许您将上游设置为尚未真正存在的内容,因为所有Git在这里真正做的是存储名称。)

相关问题