Вибір лише однієї гілки: 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.
По-перше, нам потрібно прояснити деяку термінологію. Для віддаленого відстеження гілок зазвичай слід знати три різні гілки:
- Гілка на віддаленому репо:
refs/heads/branchB
всередині іншого репо
- Ваша філія дистанційного відстеження :
refs/remotes/remoteR/branchB
у вашому репо
- Ваша власна філія:
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
, і т.д.
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 ).