W3docs

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, см. ниже) воспроизводит новую историю поверх вашей ветки.

gitpull

Когда использовать

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 эти коммиты загружаются.

gitpull1

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

gitpull2

Если локальная ветка не расходилась (у вас нет новых локальных коммитов), Git просто переносит указатель ветки вперёд к новым коммитам. Это называется fast-forward и не создаёт коммит слияния.

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

gitpull3

Основные параметры

КомандаОписание
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.

Практика

Практика
Какие из следующих утверждений о команде 'git pull' верны?
Какие из следующих утверждений о команде 'git pull' верны?
Was this page helpful?