#git-fetch-vs-pull
В чём разница между `git fetch` и `git pull`?
Что отвечать
`git fetch` тащит коммиты с remote и обновляет remote-tracking ветки (например `origin/main`), но **твою локальную ветку не двигает**. `git pull` это `git fetch` + сразу попытаться объединить с твоей локальной веткой - по умолчанию через merge, что создаёт merge-коммит если main и твоя ветка разошлись. Многие команды настраивают `git config pull.rebase true` чтобы pull делал fetch + rebase вместо merge - история чище.
Что хотят услышать
Кандидат должен: - сказать что fetch безопаснее: видишь что приехало, потом решаешь merge или rebase - объяснить что `pull --rebase` ребейзит **только твои локальные коммиты поверх свежего remote**, чужие удалённые коммиты не переписываются - это распространённое заблуждение - назвать `git config --global pull.rebase true` как разумный дефолт, и `git config --global pull.ff only` как ещё более строгий вариант (только fast-forward, иначе error) - упомянуть `git pull --autostash` для случая когда есть незакоммиченные изменения
Подводные камни
- ✗ Сказать «pull --rebase переписывает удалённые коммиты» - на самом деле только твои локальные коммиты идут поверх remote, чужие не трогаются
- ✗ Думать что `git pull` без аргументов всегда подтягивает текущую ветку - нужен tracking branch, иначе придётся `git pull origin main`
- ✗ Делать `git pull` поверх грязного working tree - merge упадёт, лучше stash или autostash
Follow-up
- ? Что покажет `git log HEAD..origin/main` после fetch?
- ? Чем `pull.ff only` отличается от `pull.rebase true`?
- ? Как откатить неудачный `git pull`?
Глубина в базе знаний