# git fetch _Удалённые репозитории · GitLab Knowledge Base_ **TL;DR:** Скачивает обновления с remote, но **не трогает** локальные ветки. Обновляет только refs/remotes/origin/. Безопасная команда: после fetch ты видишь, что пришло, и решаешь, что с этим делать. `git fetch` - половина того, что делает `git pull`. Только половина: «скачать», без «слить». Это её главное достоинство. ## Что физически происходит ```bash git fetch origin ``` 1. Подключается к origin (по SSH или HTTPS). 2. Узнаёт у remote список refs и их SHA. 3. Скачивает все коммиты, которых нет локально, в `.git/objects/`. 4. Обновляет `refs/remotes/origin/` - это «remote-tracking branches». Локальные ветки **не меняются**. `main`, `feature/x`, `HEAD` - всё на месте. Меняются только `origin/main`, `origin/feature/x` - это отдельные refs, которые отслеживают состояние remote. ```bash git log main..origin/main # коммиты, которые пришли, но не слиты git diff main origin/main # что изменится при merge ``` Это даёт паузу между «получил данные» и «применил». Можно посмотреть, что прилетело, прежде чем mergить. ## Когда нужен fetch вместо pull - **Сложные слияния.** Перед mergом хочется глянуть, что прилетело. - **Несколько remote.** При работе через fork (см. [upstream-vs-origin](/courses/git/kb/upstream-vs-origin.md)) обычно `git fetch upstream`, потом отдельно решать, что делать. - **CI/скрипты.** Скрипт сравнения версий: fetch, потом diff. - **Просто посмотреть.** «Кто что запушил за сегодня» - fetch не меняет рабочий каталог. ## Полезные флаги ```bash git fetch --all # все remote сразу git fetch --prune # удалить локальные refs веток, # которых уже нет на remote git fetch --tags # включая теги git fetch origin main # только конкретную ветку git fetch origin pull/123/head:pr-123 # GitHub PR как локальная ветка ``` `--prune` особенно полезен в долго живущем клоне: ветки в команде создаются и удаляются, без `--prune` локальный список `origin/` распухает мёртвыми ссылками. Можно настроить раз и навсегда: `git config --global fetch.prune true`. ## Что делать после fetch Типичные варианты: ```bash # Догнать локальную main без mergе git fetch origin git switch main git merge --ff-only origin/main # Альтернатива: rebase своей фичи поверх свежей main git fetch origin git switch feat/x git rebase origin/main # Просто посмотреть, что нового git fetch origin git log main..origin/main --oneline ``` ## Подводные камни - `git fetch` ничего не показывает в working tree. Если ожидаешь увидеть новые файлы - нет, нужно ещё merge или rebase. - Без `--prune` остаются «мёртвые» ветки в `origin/`. Через год их бывают десятки. - В CI с shallow clone (`--depth 1`) fetch ведёт себя ограниченно: история не догружается, нужно `--unshallow` или `--deepen N`. ## Команды ```bash git fetch ``` Скачать обновления с дефолтного remote, без merge ```bash git fetch --all --prune ``` Все remote + удалить мёртвые refs локально ```bash git fetch origin pull/N/head:pr-N ``` Скачать GitHub PR как локальную ветку ```bash git log main..origin/main ``` Что пришло, но ещё не сливалось ## См. также - [git pull](/courses/git/kb/pull.md) - [git push](/courses/git/kb/push.md) - [git remote](/courses/git/kb/remote-cmd.md) - [Tracking branch](/courses/git/kb/tracking-branch.md)