Выбор только одной ветви: fetch
/ merge
против 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 - Refspec ( или via github ). Это невероятно трудно найти через Google.
Во-первых, нам нужно прояснить некоторую терминологию. Для отслеживания удаленных веток обычно нужно знать о трех разных ветках:
- Филиал на удаленном репо:
refs/heads/branchB
внутри другого репо
- Ваша ветка удаленного слежения :
refs/remotes/remoteR/branchB
in ваше репо
- Ваш собственный филиал:
refs/heads/branchB
внутри ваш репо
Ветви удаленного отслеживания (в refs/remotes
) доступны только для чтения. Вы не изменяете их напрямую. Вы изменяете свою собственную ветку, а затем нажимаете на соответствующую ветку в удаленном репо. Результат не отражается в вашем refs/remotes
до соответствующего извлечения или извлечения. Мне было трудно понять это различие из man-страниц git, главным образом потому, что локальная ветвь (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
, и т. Д.