git pull
Узнайте о команде git pull, её параметрах и примерах использования для синхронизации локального репозитория с удалённым.
Что делает git pull
git pull загружает новые коммиты из удалённого репозитория и сразу интегрирует их в текущую локальную ветку. Эту команду запускают, чтобы привести свою работу в соответствие с тем, что отправили коллеги.
Под капотом git pull — это удобное сокращение для двух последовательно выполняемых команд:
git fetch <remote> # download the new commits
git merge <remote>/<branch> # integrate them into the current branchТо есть git pull равнозначен git fetch, за которым следует git merge. Понимание этого разделения — ключ к пониманию всей команды: fetch обновляет ваши ветки удалённого отслеживания, не затрагивая рабочую копию, а merge (или rebase, см. ниже) воспроизводит новую историю поверх вашей ветки.

Когда использовать
git pull — часть рабочего процесса синхронизации Git, наряду с git push, git fetch и git remote. Используйте её каждый раз, когда нужно, чтобы локальная ветка отражала актуальное состояние удалённого репозитория, например:
- Перед началом нового куска работы, чтобы строить на основе самого свежего кода.
- Перед выполнением git push, чтобы отправка прошла как fast-forward, а не была отклонена как «non-fast-forward».
- Чтобы подтянуть коммиты коллеги из общей ветки.
git fetch и git pull оба загружают удалённый контент, но между ними есть важное отличие: git fetch только обновляет ветки удалённого отслеживания и не трогает рабочую копию, тогда как git pull также сливает изменения в текущую ветку. Если вы хотите сначала просмотреть входящие коммиты, а потом решить, использовать ли их, выполните fetch, а merge сделайте самостоятельно.
Как работает слияние во время pull
Предположим, ваша локальная ветка и удалённая имеют общую историю до коммита E, а затем расходятся. На удалённом репозитории появились коммиты A, B и C, которых у вас нет. При выполнении git pull эти коммиты загружаются.

Затем Git создаёт новый коммит слияния H, объединяющий локальную работу с загруженными коммитами A, B и C, соединяя обе линии истории.

Если локальная ветка не расходилась (у вас нет новых локальных коммитов), Git просто переносит указатель ветки вперёд к новым коммитам. Это называется fast-forward и не создаёт коммит слияния.
С опцией --rebase Git воспроизводит ваши локальные коммиты поверх загруженных вместо создания коммита слияния, сохраняя историю линейной.

Основные параметры
| Команда | Описание |
|---|---|
git pull <remote> | Загружает удалённый контент и напрямую сливает его в локальную копию (эквивалентно git fetch <remote> с последующим git merge <remote>/<current-branch>). |
git pull --no-commit <remote> | Загружает и сливает изменения, но останавливается перед созданием коммита слияния, чтобы вы могли сначала просмотреть результат. |
git pull --rebase <remote> | Переносит ваши локальные коммиты поверх загруженных вместо слияния, сохраняя историю линейной. |
git pull --ff-only | Обновляет ветку только в том случае, если слияние может быть fast-forward; в противном случае прерывается, не изменяя ветку. |
git pull --verbose | Выводит подробную информацию, показывая загруженный контент и детали слияния в ходе операции. |
Примеры
Загрузка из вышестоящей ветки
Вызов git pull без аргументов загружает и сливает изменения из вышестоящей ветки, настроенной для текущей ветки:
git pullДля этого у текущей ветки должна быть задана вышестоящая (upstream) ветка (Git сохраняет её после первого выполнения git push -u или git branch --set-upstream-to).
Загрузка из определённого удалённого репозитория и ветки
Вы можете явно указать удалённый репозиторий и ветку:
git pull <remote> <branch>Это загружает и сливает изменения из указанной ветки именованного удалённого репозитория. Например, чтобы загрузить ветку develop из удалённого репозитория origin:
git pull origin developЗагрузка с rebase
git pull --rebaseВместо слияния эта команда воспроизводит ваши локальные коммиты поверх загруженных. В результате получается линейная история без коммита слияния, что многие команды предпочитают для feature-веток. Чтобы сделать это поведением по умолчанию для ветки, выполните git config pull.rebase true. Подробнее о компромиссах — в разделе git rebase.
Загрузка без создания коммита слияния
git pull --no-commitЗагружает и сливает изменения, но останавливается непосредственно перед созданием коммита слияния, оставляя результат в индексе, чтобы вы могли проверить (и изменить) его перед фиксацией с помощью git commit.
Разрешение конфликтов после pull
Если в удалённых коммитах были изменены те же строки, что и у вас локально, слияние не может завершиться автоматически, и Git сообщает о конфликте:
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.Чтобы разрешить конфликт, откройте каждый конфликтующий файл, отредактируйте его, оставив нужное содержимое (удалив маркеры <<<<<<<, ======= и >>>>>>>), затем добавьте файл в индекс и создайте коммит:
git add app.js
git commitЕсли вы не хотите разбираться с конфликтом прямо сейчас, команда git merge --abort вернёт ветку в состояние до pull.
Выполнение pull в ветку с незафиксированными локальными изменениями может завершиться ошибкой, потому что Git отказывается перезаписывать вашу работу. Зафиксируйте изменения или сохраните их с помощью git stash перед pull, а после — восстановите из stash.