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/Удалённые репозитории/pull

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

git pull

Затаскивает обновления с удалённого репозитория и сразу сливает с текущей веткой. По сути - `git fetch` + `git merge` (или + `git rebase` с `--rebase`). Самая запутанная команда для новичков.

view as markdownaka: git-pull

git pull - компактная обёртка над двумя операциями. По умолчанию делает fetch (скачать обновления) и потом merge (слить в текущую ветку).

Что лучше - pull или fetch + merge?

Чисто технически git pull = git fetch && git merge FETCH_HEAD. Но многие разработчики предпочитают делать эти шаги отдельно:

  • git fetch - посмотреть, что пришло, не трогая локальную ветку.
  • git log origin/main..main - проверить разницу.
  • git merge или git rebase - слить осознанно.

Это даёт паузу между «получил данные» и «изменил локальную ветку». На сложных репозиториях полезно.

--rebase vs merge

По умолчанию pull делает merge. Альтернатива - rebase:

bash
git pull --rebase

Это значит: затащить удалённые коммиты, потом переписать твои локальные коммиты так, будто ты их сделал поверх свежих удалённых. История остаётся линейной, без merge-коммитов.

Какой вариант лучше - спор десятилетий. Прагматичное правило:

  • rebase для своей feature-ветки, пока никому её не показал.
  • merge для общих веток (main, master).
  • Установить дефолт можно конфигом: git config --global pull.rebase true.

Без явной настройки Git 2.27+ выдаёт warning о неоднозначности стратегии при каждом git pull. По умолчанию pull всё равно отрабатывает (merge), но дёргает - чтобы выбор был осознанный. Поставь pull.rebase или pull.ff в конфиг, и предупреждение пропадёт.

--ff-only

Самый безопасный вариант:

bash
git pull --ff-only

Затащит обновления, только если можно fast-forward. Если у тебя локально есть несмерженные коммиты - откажет, придётся решать вручную (merge или rebase). Это предотвращает случайные merge-коммиты от инерции.

Что делает physically

  1. git fetch origin - скачивает все новые объекты в .git/objects/ и обновляет origin/<branches> (это refs/remotes/origin/...).
  2. Берёт remote tracking branch (origin/main) и сравнивает с локальной (main).
  3. Запускает merge (или rebase) FETCH_HEAD в текущую ветку.

Локальная история пишется только на шаге 3. До этого git fetch можно вызывать сколько угодно - он безопасен.

Подводные камни

  • git pull с unstaged изменениями в файлах, которые меняет remote, отвалится с ошибкой. Решение - stash перед pull или закоммитить.
  • При отсутствии tracking-ветки git pull без аргументов не работает. Нужно явно: git pull origin main.
  • git pull --rebase на ветке с уже запушенными коммитами переписывает их SHA. Это значит, что следующий push потребует --force-with-lease. Не делай это для веток, которые видят другие люди.

§ команды

bash
git pull

fetch + merge (или rebase, по конфигу)

bash
git pull --rebase

Затащить удалённое и переписать локальные коммиты поверх

bash
git pull --ff-only

Только fast-forward, отказ при расхождении

bash
git fetch && git merge origin/main

Эквивалент pull, но с возможностью посмотреть до merge

§ см. также

  • pushgit pushОтправляет локальные коммиты в удалённый репозиторий и обновляет там ветку. Если remote получил коммиты от кого-то другого после твоего последнего pull - push откажется, пока не синхронизируешься.
  • mergegit mergeСливает другую ветку в текущую. Делает либо fast-forward (двигает указатель), либо создаёт merge-коммит с двумя родителями. При пересекающихся изменениях возможны конфликты.
  • branchВетка (branch)Ветка в Git - это файл в `.git/refs/heads/`, в котором лежит SHA одного коммита. Создание, переключение и удаление веток тривиальны, потому что данных в ветке - 41 байт.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки