Чем git pull отличается от git fetch
git fetchскачивает с сервера новые коммиты и ветки, но ничего не меняет в ваших файлах и ваших ветках. Безопасна в любой момент.git pull— этоgit fetchи сразу слияние скачанного с текущей веткой (git merge, а при настройкеpull.rebase true—git rebase). Ваши файлы меняются.
Иначе говоря: git pull = git fetch + git merge origin/main (для ветки main).
Что такое origin/main
После fetch скачанное лежит в ветках вида origin/main — это копия того, как ветка main выглядела на сервере origin в момент последнего обмена. Ваша main и origin/main — разные ветки: первая двигается вашими коммитами, вторая — только при fetch, pull и push.
Все ветки, включая скачанные, показывает git branch -a:
$ git branch -a
* main
remotes/origin/HEAD -> origin/main
remotes/origin/mainПосмотреть чужие изменения до слияния
Именно для этого fetch и нужен отдельно: сначала посмотреть, потом решить.
git fetch
git log --oneline main..origin/main
git diff main origin/main
git merge origin/mainВторая команда показывает коммиты, которые есть на сервере, но ещё не у вас; третья — разницу в файлах; четвёртая — сливает, как это сделал бы pull. Если решили не сливать — просто ничего не делайте: ваша ветка не изменилась.
Сколько вы отстаёте или опережаете, после fetch подскажет git status:
Your branch is behind 'origin/main' by 1 commit, and can be fast-forwarded.Когда что использовать
| Ситуация | Команда |
|---|---|
| Обычное обновление своей ветки перед работой | git pull |
| Узнать, что нового на сервере, ничего не трогая | git fetch, затем git status или git log |
| В рабочей папке незакоммиченные правки, а посмотреть хочется | git fetch — правкам он не мешает |
| Обновить сведения обо всех удалённых репозиториях сразу | git fetch --all |
Подводные камни
git statusсам на сервер не ходит. ФразаYour branch is up to date with 'origin/main'значит «совпадает с последней скачанной копией», а не «с сервером прямо сейчас». Сначалаgit fetch.git pullможет закончиться конфликтом слияния или остановиться с сообщениемNeed to specify how to reconcile divergent branches— решение в справке rejected — non-fast-forward.git pullс незакоммиченными правками в тех же файлах откажется работать, чтобы их не испортить: сначала сделайте коммит или отложите правки через git stash.