Почему git pull необходим для обновления (другой) ветки (перемещение ветки на последний коммит без git pull)? - PullRequest
2 голосов
/ 08 июля 2019

Я бы с удовольствием написал более точную тему для этого вопроса, но сейчас я не могу выразить это лучше.

По сути, допустим, у вас есть репо, в котором у вас есть несколько веток, скажем, "master" и "mybranch".

Итак, допустим, вы на мастере:

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

Тогда вы делаете git pull здесь; новые коммиты извлекаются как для master ветви, так и для mybranch. Поскольку вы уже находитесь в ветке master, заголовок master автоматически обновляется на git до последнего принятого коммита.

Теперь предположим, что вы меняете ветку с помощью checkout:

$ git checkout mybranch
Switched to branch 'mybranch'
Your branch is behind 'origin/mybranch' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Теперь это то, что меня озадачивает - во время предыдущего опроса (очевидно) все последние коммиты - в том числе и в mybranch - были найдены; иначе мой локальный мерзавец не "знал бы", что мой локальный филиал "отстает ... на 2 коммита".

Итак, мой вопрос: зачем мне снова делать «git pull», имея ненужную обратную передачу на сервер - когда у нас уже есть эти новые коммиты для mybranch, загруженные? Разве нет «git update-head» или какой-нибудь команды, которая бы делала это локально, без обратной передачи на сервер?

Ответы [ 2 ]

4 голосов
/ 08 июля 2019

Вам не хватает удаленных отслеживающих ветвей на картинке, вот что вызывает у вас замешательство.

(Напоминание: git pull - это удобный способ выполнить две операции: git fetch затем git merge origin/<currentBranch>)

Когда вы fetch не изменяете свою локальную ветку, вы обновляете ветви удаленного отслеживания, которые являются зеркальными изображениями удаленных ветвей.

Эти ветки не должны проверяться или изменяться вами, они используются для целей, как вы упомянули, сравнений или других проверок.

git pull идет на шаг дальше, чем git fetch, и объединяет ветку удаленного слежения со своим локальным аналогом.

Это объясняет, почему вам нужно явно изменить ветвь, а затем снова потянуть (или просто объединить), чтобы обновить другую ветвь.

3 голосов
/ 08 июля 2019

Ваше объяснение того, что происходит на первом этапе, неверно.Когда вы сделали git pull из ветви master, вы действительно сделали git pull origin master.Это обновляет локальную ветку отслеживания origin/master, а затем объединяет эту ветку с вашей локальной master для быстрой перемотки вперед.Это не влияет на другие ветви.

Если вы хотите совершить только одну поездку в оба конца на сервер Git, то вы можете попробовать выполнить:

git fetch origin   # update all local tracking branches
# from e.g. mybranch
git merge origin/mybranch

Затем, если вы также хотелиобновите вашу локальную ветку master, вам нужно только оформить заказ и объединить:

git checkout master
git merge origin/master

Обратите внимание, что два вышеупомянутых шага произошли полностью локально, независимо от удаленного сервера Git.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...