Close

git pull

Команда git pull используется для извлечения и загрузки содержимого из удаленного репозитория и немедленного обновления локального репозитория этим содержимым. Слияние удаленных вышестоящих изменений в локальный репозиторий — это обычное дело в процессе совместной работы на основе Git. Команда git pull на самом деле представляет собой комбинацию двух других команд: git fetch и git merge. На первом этапе git pull выполняется команда git fetch, ограниченная локальной веткой, на которую указывает HEAD. Сразу после загрузки содержимого команда git pull выполняет слияние. Для слитого содержимого создается новый коммит, а указатель HEAD обновляется и переносится на этот новый коммит.


Использование git pull


Порядок действий

Сначала команда git pull запускает команду git fetch для загрузки содержимого из указанного удаленного репозитория. Затем выполняется команда git merge, объединяющая ссылки и указатели удаленного содержимого в новый локальный коммит слияния. Чтобы лучше продемонстрировать процесс извлечения и слияния, рассмотрим пример. Предположим, у нас есть репозиторий с главной веткой main и удаленный репозиторий origin.

В этом сценарии команда git pull загрузит все изменения, начиная с того места, где разошлись локальная и главная ветки. В данном примере это точка E. Команда git pull получит удаленные коммиты из отходящей ветки (т. е. точки A‑B‑C). Затем в процессе запуска команды pull будет создан новый локальный коммит слияния, включающий содержимое новых удаленных коммитов из отходящей ветки.

Окно консоли
Связанные материалы

Расширенный журнал Git

Логотип Bitbucket
СМ. РЕШЕНИЕ

Изучите Git с помощью Bitbucket Cloud

На вышеприведенной схеме мы видим новый коммит H. Это коммит слияния, в который входит содержимое удаленных коммитов A‑B‑C и который имеет общее сообщение в журнале. Этот пример демонстрирует одну из нескольких стратегий слияния с помощью команды git pull. Чтобы сделать перебазирование, а не коммит слитого содержимого, укажите для команды git pull параметр --rebase. В следующем примере демонстрируется, как работает перебазирование с помощью команды pull. Предположим, что мы находимся в начальной точке нашей первой схемы и выполнили команду git pull --rebase.

Из централизованного репозитория git в локальный репозиторий git

На этой схеме видно, что при перебазировании с помощью команды pull не был создан новый коммит H. Вместо этого удаленные коммиты A‑B‑C были скопированы и добавлены в историю в локальной ветке origin/main перед локальными коммитами E–F–G с перезаписью последних.

Распространенные опции


git pull <remote>

Извлечь из указанного удаленного репозитория копию текущей ветки и немедленно слить ее с локальной копией. Эта команда аналогична команде git fetch <удаленный-репозиторий>, после которой следует команда git merge origin/<текущая-ветка>.

git pull --no-commit <remote>

Подобно вызову по умолчанию, извлекает удаленное содержимое, но не создает новый коммит со слитым содержимым.

git pull --rebase <remote>

Аналогично предыдущей команде pull, только вместо команды git merge для интеграции удаленной ветки с локальной веткой используется команда git rebase.

git pull --verbose

Во время выполнения команды pull выдает подробный вывод о загружаемом содержимом и информацию о слиянии.

Обсуждение git pull


Команду git pull можно представить как версию команды svn update, только применимую в системе Git. Это простой способ синхронизировать локальный репозиторий с вышестоящими изменениями. На диаграмме ниже даны пояснения к каждому шагу процесса выполнения команды pull.

git pull

Сначала вы думаете, что ваш репозиторий синхронизирован, однако команда git fetch показывает, что с момента последней проверки версия origin ветки main была изменена. Затем команда git merge сразу интегрирует удаленную ветку main в локальную ветку.

Git pull и синхронизация


Команда git pull — одна из множества команд, отвечающих за синхронизацию удаленного содержимого. Команда git remote используется, чтобы указать, на каких удаленных конечных точках будут работать команды синхронизации. Команда git push используется для выгрузки содержимого в удаленный репозиторий.

Команду git fetch можно перепутать с командой git pull. Обе они используются для загрузки удаленного содержимого, но при этом git pull и git fetch значительно различаются по уровню безопасности. Команду git fetch можно считать «безопасным» вариантом, а git pull — «небезопасным». Команда git fetch загружает удаленное содержимое, но не изменяет состояние локального репозитория, в то время как git pull загружает удаленное содержимое и сразу пытается изменить состояние локального репозитория, чтобы оно соответствовало этому содержимому. Это может привести к возникновению непредумышленного конфликта в локальном репозитории.

Сравнение pull и rebase


Параметр --rebase можно использовать, чтобы сохранить линейную историю и избежать ненужных коммитов слияния. Многие разработчики предпочитают выполнять перебазирование, а не слияние, как бы заявляя: «Я хочу, чтобы мои изменения добавились поверх всех остальных». В этом смысле команда git pull с флагом --rebase больше похожа на команду svn update, чем на простую команду git pull.

На самом деле команда pull с опцией --rebase используется в рабочем процессе настолько часто, что для нее существует выделенная опция конфигурации:

git config --global branch.autosetuprebase always

После выполнения этой команды все команды git pull будут интегрироваться с помощью команды git rebase, а не git merge.

Примеры использования git pull


В нижеприведенных примерах показано, как использовать команду git pull в общих сценариях.

Поведение по умолчанию

git pull

Вызов команды git pull по умолчанию эквивалентен выполнению команд git fetch origin HEAD и git merge HEAD, где HEAD — это указатель на текущую ветку.

Команда git pull на удаленных ветках

git checkout new_feature
git pull <remote repo>

В этом примере сначала создается ветка и происходит переключение на нее. После этого выполняется команда git pull, в которой передается удаленный репозиторий . Это приводит к неявной загрузке (выполнению команды pull) ветки newfeature из удаленного репозитория . Как только загрузка завершается, начинается выполнение команды git merge.

Перебазирование с помощью git pull вместо слияния

В следующем примере показано, как выполнить синхронизацию с главной веткой main центрального репозитория, используя перебазирование.

git checkout main
git pull --rebase origin

В этом примере ваши локальные изменения просто помещаются поверх изменений всех остальных участников разработки.


Поделитесь этой статьей
Следующая тема

Рекомендуемые статьи

Добавьте эти ресурсы в закладки, чтобы изучить типы команд DevOps или получать регулярные обновления по DevOps в Atlassian.

Люди сотрудничают друг с другом, используя стену со множеством инструментов

Блог Bitbucket

Рисунок: DevOps

Образовательные программы DevOps

Демонстрация функций в демо-зале с участием экспертов Atlassian

Как инструмент Bitbucket Cloud работает с Atlassian Open DevOps

Подпишитесь на информационную рассылку по DevOps

Thank you for signing up