Получение изменений: 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/main

git 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.
Проверьте себя
1. В чём главное отличие git fetch от git pull?
Afetch отправляет изменения, pull забирает
Bfetch только скачивает, не меняя вашу ветку; pull скачивает и сразу вливает
CОни полностью идентичны
Dfetch работает только с ветками, pull только с тегами
2. git pull по сути эквивалентен какой паре команд?
Agit add + git commit
Bgit fetch + git merge
Cgit push + git merge
Dgit clone + git checkout
3. Почему полезно делать git pull перед git push?
AЭто ускоряет push
BЧтобы получить свежие изменения коллег и избежать отклонённого push
CИначе git удалит вашу ветку
DЭто обязательно для каждого коммита
Поддержать проект