- Андрей Куманяев/
- Git: руководства и команды/
- git fetch: загрузка обновлений из удалённого репозитория/
git fetch: загрузка обновлений из удалённого репозитория
Многие разработчики используют только git pull для обновления репозитория. Но git fetch — более безопасная альтернатива, которая даёт контроль над процессом синхронизации. Понимание разницы между ними меняет подход к работе с удалёнными репозиториями.
Что делает git fetch #
git fetch загружает изменения из удалённого репозитория — новые коммиты, ветки, теги — но не меняет вашу рабочую директорию и текущую ветку. Это безопасная операция только для чтения.
После fetch загруженные данные доступны через origin/branch-name — локальные копии удалённых веток. Ваша рабочая ветка остаётся нетронутой.
# Загрузить обновления из origin
git fetch origin
# После fetch: origin/main обновлён, но ваша main — нет
git log --oneline origin/main -5 # новые коммиты
git log --oneline main -5 # ваша ветка без изменений
Git fetch vs git pull #
git pull — это git fetch + git merge (или git rebase). Он скачивает и сразу сливает изменения.
# git pull — автоматически сливает
git pull origin main
# Эквивалентно:
git fetch origin main
git merge origin/main
Когда использовать git fetch:
- Хотите посмотреть что изменилось на сервере перед слиянием
- Боитесь неожиданных конфликтов при автоматическом merge
- Нужно обновить несколько веток, но слить только одну
- Работаете с большим репозиторием и хотите контролировать процесс
Когда git pull удобнее:
- Быстрое обновление в известном состоянии
- Нет незакоммиченных изменений
- Доверяете автоматическому слиянию
Синтаксис git fetch #
# Загрузить из origin (по умолчанию)
git fetch
# Загрузить из конкретного remote
git fetch origin
# Загрузить конкретную ветку
git fetch origin main
# Загрузить из всех remote
git fetch --all
# Загрузить и удалить устаревшие ссылки
git fetch --prune origin
git fetch -p origin
Локальные копии удалённых веток (tracking branches) #
После git fetch обновляются локальные копии удалённых веток. Они называются origin/<branch>:
# Посмотреть все ветки, включая удалённые
git branch -a
# Вывод:
# * main ← ваша локальная ветка
# feature/auth ← локальная feature ветка
# remotes/origin/main ← копия удалённой main
# remotes/origin/develop ← копия удалённой develop
# remotes/origin/feature/auth
# Посмотреть только удалённые ветки
git branch -r
origin/main — это не просто ссылка, а реальная локальная копия состояния удалённой ветки на момент последнего fetch.
Работа с ветками после fetch #
После fetch можно изучить новые изменения перед слиянием:
# Загрузить обновления
git fetch origin
# Посмотреть что изменилось на сервере
git log HEAD..origin/main --oneline
# Посмотреть diff между вашей main и удалённой
git diff main origin/main
# Слить если всё устраивает
git merge origin/main
# или
git rebase origin/main
# Создать локальную ветку от удалённой
git checkout -b feature origin/feature/new-api
# или
git switch -c feature origin/feature/new-api
git fetch –prune: удаление устаревших ссылок #
Когда удалённая ветка удаляется на сервере (например, после merge pull request), её локальная копия origin/branch остаётся у вас. Флаг --prune удаляет их:
# Обновить и удалить устаревшие локальные копии удалённых веток
git fetch --prune origin
git fetch -p origin
# Обновить все remote и удалить устаревшие
git fetch --all --prune
# Настроить автоматический prune при каждом fetch
git config --global fetch.prune true
После --prune в выводе появятся строки вида:
- [deleted] (none) -> origin/feature/old-feature
Fetch для fork workflow #
При работе с форками нужно синхронизироваться с оригинальным репозиторием:
# Добавить оригинальный репо как upstream
git remote add upstream https://github.com/original/repo.git
# Загрузить обновления из upstream
git fetch upstream
# Посмотреть новые коммиты
git log HEAD..upstream/main --oneline
# Слить в вашу main
git checkout main
git merge upstream/main
# или через rebase
git rebase upstream/main
Практические примеры #
# Базовый fetch
git fetch origin
# Загрузить все remote
git fetch --all
# Загрузить и очистить устаревшие ветки
git fetch -p
# Проверить что появилось после fetch
git log origin/main --oneline -10
# Создать локальную ветку от загруженной
git checkout -b new-feature origin/feature/new-feature
# Сравнить с удалённой веткой
git diff origin/main
# Обновить без слияния (fetch + ручной merge позже)
git fetch origin main
git diff HEAD origin/main # посмотреть различия
git merge origin/main # слить когда готовы
# Загрузить теги
git fetch origin --tags
# Fetch с подробным выводом
git fetch -v origin
# Загрузить только определённую ветку
git fetch origin develop:local-develop
Часто задаваемые вопросы #
Зачем нужен git fetch, если есть git pull? git fetch даёт контроль: сначала видите что изменилось, потом решаете сливать или нет. git pull делает это автоматически. Fetch безопаснее при работе с активными ветками или когда есть незакоммиченные изменения.
Что такое origin/master и чем это отличается от master? master — ваша локальная ветка. origin/master — локальная копия состояния ветки master на сервере origin на момент последнего fetch. Они могут расходиться, если на сервере появились новые коммиты.
Что означает флаг --prune в git fetch --prune? Удаляет локальные копии удалённых веток (origin/feature/*), которые были удалены на сервере. Помогает поддерживать чистоту в git branch -r.
Как создать локальную ветку на основе удалённой после fetch? git checkout -b local-name origin/remote-branch или git switch -c local-name origin/remote-branch.
Безопасен ли git fetch? Да, абсолютно. Fetch только скачивает данные и обновляет локальные копии удалённых веток. Ваши файлы и текущая ветка не изменяются.
Заключение #
git fetch — инструмент для осознанной синхронизации. Сначала загрузите обновления, посмотрите что изменилось, затем решите как сливать. Это профессиональный подход к работе с удалёнными репозиториями. Для автоматического слияния — git pull. Для просмотра удалённых репозиториев — git remote -v.