Что делает команда git fetch
Что проверяют
Различаете ли вы «узнать, что изменилось на сервере» и «взять эти изменения себе». Вопрос простой, но по ответу видно, работаете ли вы с git осознанно или помните две команды из туториала. Следом почти всегда идёт «чем тогда отличается git pull» и «как посмотреть, что именно приехало после fetch».
Как отвечать
git fetch скачивает из удалённого репозитория новые коммиты, ветки и теги и обновляет remote-tracking ссылки вида refs/remotes/origin/*. Ваша рабочая копия, индекс и текущая ветка не меняются: main остаётся там же, где была, а origin/main уезжает вперёд. Дальше вы сами решаете, что с этим делать.
- посмотреть входящее:
git log --oneline HEAD..origin/mainпокажет список новых коммитов,git diff HEAD origin/mainих содержимое; - интеграция отдельным шагом:
git merge origin/main,git rebase origin/mainилиgit pull, который и есть fetch плюс merge (либо rebase, если заданpull.rebase=true); - удалённые на сервере ветки: сам по себе fetch ссылки на них не убирает, нужен
git fetch --pruneили настройкаfetch.prune=true; - область действия:
git fetch originтянет один remote,--allвсе,git fetch origin mainодну ветку,--tagsзабирает теги целиком; - FETCH_HEAD: ссылка на то, что приехало последним вызовом, по ней удобно посмотреть результат без слияния.
Хорошо закончить сценариями из работы: освежить origin/main перед созданием ветки, проверить перед пушем, не ушла ли удалённая ветка вперёд, посмотреть чужую ветку через git switch --detach origin/feature не трогая свою.
Где спотыкаются
Говорят «fetch скачивает изменения в мою ветку». Он не трогает ни одну локальную ветку, и именно поэтому его можно делать в любой момент, даже посреди правок.
Не знают про --prune и месяцами таскают ссылки на ветки, которых на сервере давно нет. В большой команде такой список превращается в мусор, по которому невозможно ориентироваться.
Считают fetch и pull взаимозаменяемыми. Разница в том, что pull меняет вашу ветку и может создать конфликт или лишний merge-коммит прямо сейчас, а fetch оставляет решение за вами.