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

Вкратце: у меня есть «гусеничная» ветка, которую я не могу потянуть.

И вот я в "ведре-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: [email protected]:abcd/main.git
  Push  URL: [email protected]: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)

Действительно, ведро-4 помечено как "гусеничное", но оно почему-то настроено на толчок, а не на вытягивание.

Глядя на мой файл .git/config, я вижу, что у меня есть записи «удаленные» и «объединенные» для большинства моих веток, но не для ветки-4. Как он вообще считается "гусеничным" без этого?

[remote "origin"]
    url = [email protected]: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 записей для бакета-4 в мой файл конфигурации. Но как он без этого считается "гусеничным"? ведро-4 было создано локально, а затем отправлено на сервер из этого репозитория, поэтому я подозреваю, что каким-то образом я не настроил отслеживание должным образом для этой ветки.

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


person George Armhold    schedule 12.09.2011    source источник
comment
Этот вопрос указал мне правильное направление, мне просто нужно было добавить запись в мой файл .git/config для ветки, которую я пытался вытащить, после чего все заработало нормально.   -  person Mr. Bungle    schedule 26.07.2012
comment
Да, я тоже, и способ сделать это, как Марк Лонгейр описал ниже, с веткой git --set-upstream Bucket-4 origin/bucket-4   -  person Jonathon Horsman    schedule 18.07.2013


Ответы (2)


Он говорит 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 этой ветки в ее вышестоящий репозиторий.

Я надеюсь, что это поможет.

person Mark Longair    schedule 12.09.2011
comment
git branch --set-upstream у меня отлично работало до того, как я сделал тягу - person ohaal; 31.10.2012
comment
git branch --set-upstream Bucket-4 origin/bucket-4 у меня работал :-) - person Aliza; 24.12.2013
comment
Что делать, если вы не хотите нажимать? У меня такая же проблема, но я не хочу отталкиваться от репо, в котором возникает эта проблема. Я только что переключил удаленное происхождение и хочу получить последний HEAD для ветки, которая, по-видимому, больше не отслеживается (хотя она отслеживалась до того, как я переключил удаленное происхождение). В конце концов я удалил проблемный клон и повторно клонировал из нового источника. - person geoidesic; 24.12.2015
comment
На самом деле при попытке git --set-upstream <branch> origin/<branch> вы получаете сообщение об ошибке, поскольку флаг устарел. Рекомендуется использовать git branch --track origin/<branch> или --set-upstream-to в качестве второго предложенного ответа. Думаю, ответ можно обновить, @MarkLongair? - person AymDev; 22.09.2018
comment
Спасибо за предложение, @AymDev - я внес это изменение. - person Mark Longair; 28.09.2018

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

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

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