你问我拉不告诉你要合并哪个分支


125

TL; DR:我有一个无法跟踪的“跟踪”分支。

所以我在“ bucket-4”中:

$ git branch -v
  bucket-1       410f7b5 * gh-53 * gh-48 * "Share App"
  bucket-2       7ed70a2 * upgrade to SOLR 3.3.0
  bucket-3       400ffe4 * emergency fix prod issue
* bucket-4       64c2414 Merge branch 'bucket-3' into bucket-4
  master         8dc4854 [ahead 1] * gh-73

我想从我的遥控器中提取更改:

$ git pull

You asked me to pull without telling me which branch you
want to merge with, and 'branch.bucket-4.merge' in
your configuration file does not tell me, either. Please
specify which branch you want to use on the command line and
try again (e.g. 'git pull <repository> <refspec>').
See git-pull(1) for details.

If you often merge with the same branch, you may want to
use something like the following in your configuration file:

    [branch "bucket-4"]
    remote = <nickname>
    merge = <remote-ref>

    [remote "<nickname>"]
    url = <url>
    fetch = <refspec>

See git-config(1) for details.

嗯,奇怪,我以为我已经添加了“ bucket-4”作为跟踪分支。让我们来看看:

$ git remote show origin
* remote origin
  Fetch URL: git@github.com:abcd/main.git
  Push  URL: git@github.com:abcd/main.git
  HEAD branch (remote HEAD is ambiguous, may be one of the following):
    bucket-3
    master
  Remote branches:
    bucket-1       tracked
    bucket-2       tracked
    bucket-3       tracked
    bucket-4       tracked
    master         tracked
  Local branches configured for 'git pull':
    bucket-1       merges with remote bucket-1
    bucket-2       merges with remote bucket-2
    bucket-3       merges with remote bucket-3
    master         merges with remote master
  Local refs configured for 'git push':
    bucket-1       pushes to bucket-1       (up to date)
    bucket-2       pushes to bucket-2       (up to date)
    bucket-3       pushes to bucket-3       (up to date)
    bucket-4       pushes to bucket-4       (local out of date)
    master         pushes to master         (fast-forwardable)

确实,bucket-4被标记为“已跟踪”,但是以某种方式将其配置为推动而不是拉动。

查看我的.git/config文件,我发现我的大多数分支都有“远程”和“合并”条目,而bucket-4没有。没有这个,它怎么被认为是“追踪的”呢?

[remote "origin"]
    url = git@github.com:abcd/main.git
    fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
    remote = origin
    merge = refs/heads/master
[branch "rel-2011-07-07"]
    remote = origin
    merge = refs/heads/rel-2011-07-07
[branch "bucket-1"]
    remote = origin
    merge = refs/heads/bucket-1
[branch "bucket-2"]
    remote = origin
    merge = refs/heads/bucket-2
[branch]
    autosetupmerge = true
[branch "bucket-3"]
    remote = origin
    merge = refs/heads/bucket-3

我看到这里可能的解决方案是remote/merge在配置文件中添加bucket-4的条目。但是,如果没有此功能,如何将其视为“已跟踪”?bucket-4是在本地创建的,然后从此存储库推送到服务器,因此我怀疑由于某种原因我没有为此分支正确设置跟踪。

我可以添加一些配置,以使将来所有本地分支机构正确跟踪其远程站点吗?


2
这个问题为我指明了正确的方向,我只需要在.git / config文件中为我要拉的分支添加一个条目,然后它就可以正常工作。
Bungle先生2012年

我也是,这是Mark Longair在下面用git branch --set-upstream bucket-4 origin / bucket-4
Jonathon Horsman

Answers:


191

bucket-4 pushes to bucket-4只是因为推送分支时的默认设置是将其推送到遥控器上具有匹配名称的分支。(请注意,即使本地分支正在跟踪远程跟踪分支,并且远程跟踪分支与远程存储库中具有不同名称的分支相对应,这仍然是默认设置。)

设置你之间的关联最简单的方法bucket-4,并bucket-4origin是确保在下次推的时候,你这样做:

git push -u origin bucket-4

或者,您可以执行以下操作:

git branch --set-upstream-to origin/bucket-4

要直接回答几个问题:

没有这个,它怎么被认为是“追踪的”呢?

在这种情况下,没有-这不是在任何意义上跟踪远程跟踪分支如果没有branch.bucket-4.merge或者branch.bucket-4.remote在你的混帐配置。来自的输出git remote show origin仅显示默认情况下分支将被推送到的位置。

我可以添加一些配置,以使将来所有本地分支机构正确跟踪其远程站点吗?

我认为没有。当您在bucket-4本地创建时,正如我想的那样,远程跟踪分支并不存在,因此无法在那时进行设置-这将使默认行为非常混乱。您只需要记住将分支-u的第一个添加git push到其上游存储库即可。

希望对您有所帮助。


7
git branch --set-upstream在拉动之前对我来说工作非常完美
ohaal

git branch --set-upstream bucket-4 origin / bucket-4为我工作:-)
Aliza

如果您不想推动怎么办?我有同样的问题,但我不想从发生此问题的仓库中进行推送。我只是切换了远程原点,我想为显然不再跟踪的分支(即使在切换远程原点之前已对其进行跟踪)下拉最新的HEAD。最后,我删除了有问题的克隆,并从新的源重新克隆。
geoidesic 2015年

1
实际上,当git --set-upstream <branch> origin/<branch>不推荐使用该标志时,您会遇到错误。建议使用git branch --track origin/<branch>--set-upstream-to作为建议的第二个答案。我猜答案可以更新,@MarkLongair吗?
AymDev

感谢您的建议,@ AymDev-我进行了更改。
Mark Longair

6

git branch --set-upstream <branch> origin/<branch> 至少从1.8.2.3(我的版本)开始不推荐使用。

使用git branch --set-upstream-to=origin/<branch> <branch>代替。


2
您是要对马克的回答发表评论吗?另外,它在Git版本1.8.0中实际上已被弃用。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.