Вы попросили меня вытащить, не сказав, с какой веткой вы хотите объединиться

125

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.

Хм, странно, я думал, что уже добавил "ведро-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файл, я вижу, что у меня есть записи «удаленный» и «слияние» для большинства моих веток, но не для ведра-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 файл для ветки, которую я пытался вытащить, и все работало нормально.
Mr. Bungle
Да, я тоже, и способ сделать это, как описал ниже Марк Лонгэр, с помощью git branch --set-upstream bucket-4 origin / bucket-4
Jonathon Horsman

Ответы:

191

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

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

git push -u origin bucket-4

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

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

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

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

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

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

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

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

Марк Лонгэр
источник
7
git branch --set-upstreamу меня отлично работал, прежде чем делать тягу
охаал
git branch --set-upstream bucket-4 origin / bucket-4 сработал для меня :-)
Aliza
Что делать, если ты не хочешь давить? У меня такая же проблема, но я не хочу выходить из репо, в котором возникает эта проблема. Я только что переключил удаленное происхождение и хочу загрузить последнюю версию HEAD для ветки, которая, по-видимому, больше не отслеживается (даже если она отслеживалась до того, как я переключил удаленное происхождение). В конце концов, я удалил проблемный клон и повторно клонировал его из нового источника.
geoidesic
1
На самом деле при попытке git --set-upstream <branch> origin/<branch>вы получаете сообщение об ошибке, так как флаг устарел. Рекомендуется использовать git branch --track origin/<branch>или --set-upstream-toкак предложенный второй ответ. Думаю, ответ можно обновить, @MarkLongair?
AymDev
Спасибо за предложение, @AymDev - я внес это изменение.
Марк Лонгэр
6

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

git branch --set-upstream-to=origin/<branch> <branch>Вместо этого используйте .

d_roge
источник
2
Вы хотели, чтобы это был комментарий к ответу Марка ? Кроме того, он фактически устарел в Git версии 1.8.0 .