Як я "git fetch" і "git merge" з віддаленої гілки відстеження (як-от "git pull")


111

Я створив декілька гілок віддаленого відстеження в git, але, здається, ніколи не зможу об'єднати їх у локальну гілку, як тільки я оновив їх з 'git fetch'.

Наприклад, припустимо, у мене є віддалена гілка, яка називається "інша гілка". Я встановив це локально як гілку відстеження, використовуючи

git branch --track an-other-branch origin/an-other-branch

Все йде нормально. Але якщо ця гілка оновлюється (як правило, я переміщую машину і здійснюю комбінацію з цієї машини), і я хочу оновити її на початковій машині, я зіткнувся з проблемою із завантаженням / злиттям:

git fetch origin an-other-branch
git merge origin/an-other-branch

Щоразу, коли я це роблю, я отримую повідомлення "Вже актуальне" і нічого не зливається.

Однак а

git pull origin an-other-branch

завжди оновлює його так, як ви очікували.

Також біг git diff

git diff origin/an-other-branch

показує, що існують відмінності, тому я вважаю, що синтаксис неправильний.

Що я роблю неправильно?

EDIT [2010-04-09]: Я кілька разів перевіряв, і я точно не в іншому відділенні. Чи повинен мій "git fetch" з наступним "git merge" (як показано вище) робити те саме, що і git pull? Я отримаю деякий робочий процес із відображенням результатів статусу git тощо.

Відповіді:


170

Ви не отримуєте гілки, ви отримуєте весь пульт:

git fetch origin
git merge origin/an-other-branch

8
Детальніше: git fetch origin an-other-branchзберігає отриманий наконечник FETCH_HEAD, але не origin/an-other-branch(тобто звичайну гілку віддаленого відстеження). Так, можна зробити git fetch origin an-other-branch && git merge FETCH_HEAD, але робити це так, як @Gareth каже, що краще (або просто використовувати git pull ).
Кріс Джонсен

тож якщо походження має 1000 відділень, ви б віддалене відділення для всіх?
Готьє

4
Звичайно. Якщо я додати до шахти віддалене сховище з 1000 гілками, і я запитую, які гілки має віддалений, прокляте краще, дайте мені всі 1000
Гарет

буде git merge origin/an-other-branchзливатися origin/an-other-branchв усі місцеві осередки, які встановлені для відстеження його? як я можу об'єднатись лише в одну місцеву гілку?
амфібій

1
Отже, що робить git pull(без аргументів) - яку галузь вона об'єднує? Чи об'єднує гілка дистанційного відстеження, що відповідає поточній гілці?
Червоний горох

69

Вибір лише однієї гілки: fetch/ merge vs. pull

Люди часто радять відокремлювати "видобуток" від "злиття". Вони замість цього кажуть:

    git pull remoteR branchB

зробити це:

    git fetch remoteR
    git merge remoteR branchB

Те, що вони не згадують, - це те, що така команда вилучення фактично отримає всі гілки з віддаленого репо, а це не те, що робить команда витягування. Якщо у віддаленому РЕПО є тисячі гілок, але ви не хочете бачити їх усіх, ви можете запустити цю незрозумілу команду:

    git fetch remoteR refs/heads/branchB:refs/remotes/remoteR/branchB
    git branch -a  # to verify
    git branch -t branchB remoteR/branchB

Звичайно, це смішно важко запам'ятати, тому якщо ви дійсно хочете уникати отримання всіх гілок, краще змінити свої, .git/configяк описано в ProGit.

Так?

Найкраще пояснення всього цього - у розділі 9-5 програми ProGit, Git Internals - The Refspec ( або через github ). Це надзвичайно важко знайти через Google.

По-перше, нам потрібно прояснити деяку термінологію. Для віддаленого відстеження гілок зазвичай слід знати три різні гілки:

  1. Гілка на віддаленому репо: refs/heads/branchBвсередині іншого репо
  2. Ваша філія дистанційного відстеження : refs/remotes/remoteR/branchBу вашому репо
  3. Ваша власна філія: refs/heads/branchBвсередині вашого репо

Гілки віддаленого відстеження (в refs/remotes) доступні лише для читання. Ви не змінюєте їх безпосередньо. Ви змінюєте свою власну гілку, а потім натискаєте на відповідну гілку на віддаленому репо. Результат не відображається у ваших refs/remotesобставинах, поки не відбудеться відповідне витягнення або отримання. Це розрізнення мені було важко зрозуміти з git man-pages, головним чином тому, що місцеве відділення ( refs/heads/branchB), як кажуть, "відстежує" гілку віддаленого відстеження, коли .git/configвизначається branch.branchB.remote = remoteR.

Подумайте про "refs" як на C ++ вказівники. Фізично це файли, що містять SHA-дайджести, але в основному вони є лише вказівниками на дерево комітів. git fetchдодасть багато вузлів до вашого дерева комітів, але те, як git вирішує, які покажчики переміщувати, трохи складніше.

Як було сказано в іншій відповіді , жоден

    git pull remoteR branchB

ні

    git fetch remoteR branchB

рухався б refs/remotes/branches/branchB, і останні, безумовно, не можуть рухатися refs/heads/branchB. Однак обидва рухаються FETCH_HEAD. (Ви можете catбудь-який з цих файлів всередині , .git/щоб бачити , коли вони змінюються.) І git mergeбуде ставитися до FETCH_HEAD, в той час як установка MERGE_ORIG, і т.д.


1
Чи знаєте ви, що ваше посилання на Git Internals - це посилання на це ж питання?
Шахбаз

9

Ви впевнені, що перебуваєте на локальному рівні, an-other-branchколи зливаєтесь?

git fetch origin an-other-branch
git checkout an-other-branch
git merge origin/an-other-branch

Інше пояснення :

всі зміни з гілки, яку ви намагаєтеся об’єднати, уже були об'єднані до гілки, в якій ви зараз перебуваєте.
Більш конкретно, це означає, що гілка, яку ви намагаєтеся об'єднати, є батьківською стороною вашої поточної гілки

якщо ви випередили віддалене репо на один прихил, то застаріле репо застаріло, а не ви.

Але у вашому випадку, якщо це git pullпрацює, це просто означає, що ви не на правильній гілці.


3

Git pull - це фактично комбінований інструмент: він запускає git fetch (отримання змін) та git merge (злиття їх із вашою поточною копією)

Ви впевнені, що на правильній гілці?


Я думаю, що ОП у відмінності. гілка, трапляється зі мною.
Chaklader Asfak Arefe

1

це команди:

git fetch origin
git merge origin/somebranch somebranch

якщо ви робите це у другому рядку:

git merge origin somebranch

він спробує об'єднати місцевого господаря у вашу поточну галузь.

Питання, наскільки я це зрозумів, чи було ви знайдено вже локально і хочете тепер об'єднати свою гілку з останньою з тієї ж гілки.

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