linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
home/git/kb/Удалённые репозитории/fetch

kb/remote ── Удалённые репозитории ── beginner

git fetch

Скачивает обновления с remote, но **не трогает** локальные ветки. Обновляет только refs/remotes/origin/. Безопасная команда: после fetch ты видишь, что пришло, и решаешь, что с этим делать.

view as markdownaka: git-fetch

git fetch - половина того, что делает git pull. Только половина: «скачать», без «слить». Это её главное достоинство.

Что физически происходит

bash
git fetch origin
  1. Подключается к origin (по SSH или HTTPS).
  2. Узнаёт у remote список refs и их SHA.
  3. Скачивает все коммиты, которых нет локально, в .git/objects/.
  4. Обновляет refs/remotes/origin/<branch> - это «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) обычно 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/<branches> распухает мёртвыми ссылками. Можно настроить раз и навсегда: 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

Что пришло, но ещё не сливалось

§ см. также

  • pullgit pullЗатаскивает обновления с удалённого репозитория и сразу сливает с текущей веткой. По сути - `git fetch` + `git merge` (или + `git rebase` с `--rebase`). Самая запутанная команда для новичков.
  • pushgit pushОтправляет локальные коммиты в удалённый репозиторий и обновляет там ветку. Если remote получил коммиты от кого-то другого после твоего последнего pull - push откажется, пока не синхронизируешься.
  • remote-cmdgit remoteУправляет списком URL-ов, с которыми связан репозиторий. По умолчанию после `clone` один remote по имени `origin`. Можно добавить второй (`upstream` для fork-flow), удалить, переименовать.
  • tracking-branchTracking branchСвязь между локальной веткой и удалённой: «эта моя ветка следит за этой удалённой». Включает поведение `git pull`/`push` без аргументов и `git status` сообщения вида «ahead 3, behind 2».
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки