Вы попросили меня вытащить, не сказав мне, с какой ветвью вы хотите слиться - PullRequest
123 голосов
/ 12 сентября 2011

TL; DR: у меня есть "отслеживаемая" ветвь, которую я не могу вытащить.

Итак, я нахожусь в "ведре-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 помечен как «отслеживаемый», но каким-то образом он настроен на push, но не на pull.

Глядя на мой файл .git/config, я вижу, что у меня есть записи "remote" и "merge" для большинства моих веток, но не для 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 ]

187 голосов
/ 12 сентября 2011

Там написано bucket-4 pushes to bucket-4 только потому, что по умолчанию при нажатии на ветвь это нажатие на ветку с соответствующим именем на пульте. (Обратите внимание, что это по-прежнему значение по умолчанию, , даже если локальная ветвь отслеживает ветку удаленного отслеживания, а ветвь удаленного отслеживания соответствует ветви с другим именем в удаленном хранилище.)

Самый простой способ установить связь между bucket-4 и bucket-4 в origin - это убедиться, что при следующем нажатии вы выполните:

git push -u origin bucket-4

В качестве альтернативы вы можете сделать:

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

Чтобы ответить на пару ваших вопросов напрямую:

Как это вообще считается "отслеживаемым" без этого?

В этом случае это не так - это не отслеживание ветви удаленного отслеживания в любом смысле, если в вашей конфигурации git нет branch.bucket-4.merge или branch.bucket-4.remote. Вывод git remote show origin просто показывает вам, куда ветка будет перемещена по умолчанию.

Есть ли какая-нибудь конфигурация, которую я могу добавить, чтобы все локальные филиалы правильно отслеживали свои пульты в будущем?

Я не думаю, что есть. Когда вы создали bucket-4 локально, как я полагаю, произошло, ветка удаленного отслеживания не существовала, поэтому ее нельзя было настроить в этот момент - это было бы очень запутанным поведением по умолчанию. Вам просто нужно не забыть добавить -u к вашему первому git push этой ветки в его исходный репозиторий.

Надеюсь, это поможет.

5 голосов
/ 06 августа 2014

git branch --set-upstream <branch> origin/<branch> устарело, по крайней мере, начиная с 1.8.2.3 (моя версия).

Используйте взамен git branch --set-upstream-to=origin/<branch> <branch>.

...