Вибір лише однієї гілки: 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 ).