Получение изменений: fetch и pull
Забираем работу коллег с сервера и наконец понимаем разницу между fetch и pull.
Две команды для получения
Коллега запушил изменения на GitHub. Чтобы они появились у вас, есть два инструмента — и важно понимать разницу.
git fetch— скачивает изменения с сервера, но не трогает ваши файлы.git pull— скачивает и сразу вливает их в текущую ветку.
git fetch — посмотреть, но не трогать
git fetch загружает новые коммиты с сервера и обновляет «удалённые» ветки вроде origin/main, но ваша локальная ветка main и файлы остаются нетронутыми. Это безопасно: вы сначала смотрите, что пришло, и только потом решаете, что с этим делать.
git fetch originПосле fetch можно сравнить свою ветку с серверной:
git log main..origin/main # какие коммиты есть на сервере, но не у меняКогда вы готовы, вливаете изменения обычным merge:
git merge origin/maingit pull — забрать и влить сразу
git pull — это, по сути, git fetch плюс git merge одной командой. Удобно для быстрой синхронизации:
git pullВывод:
Updating 9f8e7d6..a1b2c3d Fast-forward profile.py | 12 ++++++++++++ 1 file changed, 12 insertions(+)
| Команда | Скачивает | Меняет вашу ветку |
git fetch | да | нет |
git pull | да | да (fetch + merge) |
Привычка: pull перед push
Хорошее правило — делать git pull перед началом работы и перед git push. Так вы сразу получаете свежие изменения коллег и избегаете отклонённого push. Если при pull возникнет конфликт, разрешайте его так же, как конфликт merge из прошлого раздела.
pull с rebase
Чтобы история оставалась линейной, без лишних merge-коммитов от синхронизации, многие предпочитают:
git pull --rebaseЭта команда «переставит» ваши локальные коммиты поверх серверных вместо создания merge-коммита. Подробнее о rebase — в последнем разделе курса.
Почему fetch безопаснее
Многие опытные разработчики предпочитают связку git fetch + просмотр + git merge вместо одного git pull. Причина — контроль. После fetch вы сначала смотрите, какие коммиты пришли с сервера, оцениваете, не сломают ли они что-нибудь, и только потом осознанно вливаете. pull же делает всё разом, и иногда merge случается неожиданно — например, прямо посреди вашей недоделанной работы. Для новичка pull проще, но привычку поглядывать через fetch стоит выработать.
Что значит «ahead» и «behind»
После fetch git может сообщить, что ваша ветка «ahead 2, behind 3». Это значит: у вас есть 2 коммита, которых нет на сервере, и на сервере есть 3 коммита, которых нет у вас. Чтобы синхронизироваться, нужно и забрать чужие (pull/merge), и отправить свои (push). Эти числа — удобный индикатор того, насколько ваша локальная копия разошлась с удалённой.
Итог
git fetchтолько скачивает изменения, не трогая вашу ветку и файлы.git pull= fetch + merge: скачивает и сразу вливает.- Делайте
git pullперед push, чтобы избежать отклонённого push.