Чем отличается git pull от git fetch?
git fetch и git pull оба получают изменения из remote-репозитория, но работают по-разному. Понимание разницы помогает избегать неожиданных конфликтов.
git fetch скачивает изменения из remote, но не применяет их к вашей рабочей директории. Обновляются только remote-tracking-ветки (origin/main, origin/feature и т.д.). Ваша локальная ветка и рабочие файлы остаются нетронутыми. После fetch вы можете просмотреть изменения: git log origin/main, git diff main origin/main. Это безопасно — вы ничего не ломаете, просто получаете информацию о новых коммитах.
git pull = git fetch + git merge. Сначала скачивает изменения, затем сразу объединяет их с вашей текущей веткой. Если в remote есть новые коммиты, а у вас — локальные изменения, pull создаст merge-коммит или, при расхождениях, конфликты. Это может быть неожиданным, если вы не проверили, что именно изменилось в remote.
Когда использовать fetch: всегда, когда хотите посмотреть, что нового в remote, перед применением. Особенно полезно перед началом работы — выполните git fetch утром, проверьте git log origin/main, и если всё в порядке, сделайте git merge или git rebase. Также fetch нужен для просмотра чужих feature-веток без переключения на них.
Когда использовать pull: когда вы уверены, что в remote нет неожиданных изменений и хотите быстро обновиться. Например, вы единственный разработчик на ветке или изменения тривиальны.
Pull с rebase: git pull --rebase вместо merge применяет ваши локальные коммиты поверх скачанных. Это даёт линейную историю без merge-коммитов. Можно настроить по умолчанию: git config --global pull.rebase true. Многие команды предпочитают этот вариант.
Практический совет: используйте git fetch по привычке, а git pull — только когда точно знаете, что получите. Это избавит от неожиданных конфликтов в неподходящий момент.