Что делает команда git fetch
Что проверяют
Понимаете ли вы разницу между локальными ветками и ветками удалённого отслеживания, то есть что происходит с main и origin/main после команды. Следом почти всегда спрашивают, чем git fetch отличается от git pull и как безопасно подтянуть свежий develop в свою фиче-ветку.
Как отвечать
git fetch скачивает с удалённого репозитория новые коммиты, ветки и теги и обновляет ссылки вида origin/main, origin/develop. Рабочую копию, индекс и ваши локальные ветки он не трогает, поэтому команда безопасна в любой момент, даже с незакоммиченными правками. Результат последнего получения записывается в FETCH_HEAD.
Полезные варианты:
git fetch origin: всё с одного удалённого репозитория,git fetch --allсо всех;git fetch --prune: удаляет локальные ссылки на ветки, которых на сервере уже нет. Можно включить навсегда черезgit config fetch.prune true;git fetch origin develop: только одна ветка.
После fetch изменения можно изучить до слияния: git log HEAD..origin/develop покажет коммиты, которых у вас нет, а git diff HEAD...origin/develop покажет, что поменялось на той стороне с момента расхождения. Затем вы сами решаете: git merge origin/develop или git rebase origin/develop.
git pull это fetch плюс слияние в текущую ветку: по умолчанию merge, с флагом --rebase или настройкой pull.rebase перебазирование.
В Android-проекте это обычная ситуация: коллега поднял версию Android Gradle Plugin или зависимости в libs.versions.toml, и вы хотите посмотреть эти изменения до того, как влить их и запускать долгую синхронизацию Gradle. В Android Studio то же самое делает пункт Fetch в меню Git.
Где спотыкаются
Думают, что после fetch обновился локальный main. Он остался прежним, свежее состояние лежит в origin/main, и нужно отдельно сделать merge или rebase.
Верят git status на слово. Сообщение «Your branch is up to date» сравнивает с origin/main на момент последнего fetch, сервер при этом никто не спрашивал.
Путают origin/main и origin main. Первое это ссылка в вашем репозитории, второе это пара аргументов «удалённый репозиторий и ветка» для команд fetch, pull и push.