Ви попросили мене витягнути, не сказавши мені, з якою гілкою ви хочете злитися


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)

Дійсно, відро-4 позначено як "гусеничне", але все-таки воно налаштоване на "push", але не "pull".

Переглядаючи свій .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 файл для гілки, яку я намагався витягнути, тоді вона спрацювала нормально.
Містер Бунгл,

Так само мені, і спосіб зробити це так, як описано нижче Марком Лонгейром з гіткою git --set-upstream bucket-4 origin / bucket-4
Jonathon Horsman

Відповіді:


191

Це говорить 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 config немає 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

Що робити, якщо ви не хочете натискати? У мене є ця сама проблема, але я не хочу наполягати на репо, що ця проблема виникає. Я просто переключився на віддалене джерело і хочу зняти останню ГОЛОВУ для гілки, яка, мабуть, більше не відслідковується (хоча вона була відстежена ще до того, як я переключився на віддалене походження). Врешті-решт я видалив проблемний клон і повторно клонувався з нового походження.
геодезичний

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>замість цього.


2
Ви мали на увазі це коментар до відповіді Марка ? Крім того, він фактично застарів у Git версії 1.8.0 .
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.