↓Перейти к содержанию
  1. Git: руководства и команды/

git pull: как получить обновления из удалённого репозитория Git

·5 минут·

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

Что делает git pull #

git pull — это комбинация двух команд:

git pull origin main

# Эквивалентно:
git fetch origin          # 1. Загрузить изменения с сервера
git merge origin/main     # 2. Слить их с текущей веткой

git fetch скачивает коммиты из удалённого репозитория, но не применяет их к вашей локальной ветке. Изменения хранятся в origin/main (удалённый tracking branch).

git merge объединяет скачанные изменения с вашей локальной веткой.

Базовое использование #

# Получить изменения из origin в текущую ветку
git pull

# Явно указать remote и ветку
git pull origin main
git pull origin develop

git pull vs git fetch: что выбрать #

Это важное различие:

КомандаСкачиваетПрименяет к локальной ветке
git fetch✓✗
git pull✓✓ (через merge или rebase)

Некоторые разработчики предпочитают делать git fetch + просмотр + git merge вместо git pull:

git fetch origin

# Посмотреть что пришло
git log --oneline HEAD..origin/main   # Что пришло с сервера
git diff HEAD origin/main             # Разница

# Только после проверки — слить
git merge origin/main

Это даёт больший контроль, но требует дополнительных шагов. Для большинства случаев git pull удобнее.

Флаги и опции #

–rebase: вместо merge делать rebase #

git pull --rebase origin main

Вместо создания merge-коммита, ваши локальные коммиты «перекладываются» поверх скачанных:

Без --rebase:   A ← B ← C ← M (merge commit)
                         ↗
                    D ← E (ваши коммиты)

С --rebase:     A ← B ← D ← E (ваши коммиты поверх)

История становится линейной. Это удобно для feature-веток, где важна чистота истории.

Можно настроить rebase по умолчанию:

git config --global pull.rebase true

–no-commit: слить, но не коммитить автоматически #

git pull --no-commit origin main
# Изменения слиты, но merge commit ещё не создан
# Можно проверить и затем:
git commit

–no-ff: всегда создавать merge commit #

git pull --no-ff origin main
# Даже при fast-forward будет создан merge commit

Разрешение конфликтов при pull #

Конфликт возникает, если вы и коллега изменили одни и те же строки в одном файле:

git pull origin main
# Auto-merging app.js
# CONFLICT (content): Merge conflict in app.js
# Automatic merge failed; fix conflicts and then commit the result.

Что делать:

# 1. Посмотреть конфликтующие файлы
git status
# both modified: app.js

# 2. Открыть файл и найти маркеры конфликта
# <<<<<<< HEAD
# ваш код
# =======
# код из origin
# >>>>>>> origin/main

# 3. Отредактировать файл, оставив нужную версию

# 4. Отметить конфликт как решённый
git add app.js

# 5. Завершить merge commit
git commit

Отмена pull при конфликтах #

git merge --abort
# Возвращает состояние до git pull

Сохранение незакоммиченных изменений перед pull #

Если у вас есть незакоммиченные изменения, а нужно сделать pull:

# Способ 1: stash
git stash
git pull origin main
git stash pop       # Восстановить изменения
# Разрешить возможные конфликты stash

# Способ 2: закоммитить
git add .
git commit -m "WIP: сохранение перед pull"
git pull origin main

Проверка что придёт с сервера (до pull) #

# Обновить информацию об удалённых ветках без слияния
git fetch origin

# Посмотреть что пришло с сервера (ещё не у нас)
git log --oneline HEAD..origin/main

# Посмотреть наши коммиты которых нет на сервере
git log --oneline origin/main..HEAD

# Посмотреть разницу
git diff origin/main

Типичные сценарии #

Обновление main в начале рабочего дня #

git switch main
git pull origin main
# Теперь main актуален
git switch feature/my-task
# Продолжаем работу

Обновление feature-ветки от main #

git switch feature/my-task
git pull origin main  # Получить обновления main в feature-ветку
# Разрешить возможные конфликты

Или через rebase:

git switch feature/my-task
git pull --rebase origin main

Простой pull в текущую ветку #

# Если отслеживание настроено
git pull

Практический пример #

# Начало рабочего дня
git switch main
git pull origin main
# Already up to date. или список обновлённых файлов

git log --oneline -5
# Посмотреть что появилось нового

# Начать работу над задачей
git switch -c feature/dashboard
echo "dashboard code" > dashboard.js
git add dashboard.js
git commit -m "feat: add dashboard skeleton"

# Конец дня: обновить от main (могли прийти изменения)
git pull --rebase origin main

# Отправить работу
git push -u origin feature/dashboard

Часто задаваемые вопросы #

Чем отличается git pull от git fetch? git fetch только скачивает данные с сервера, не изменяя вашу рабочую директорию. git pull — это git fetch + git merge (или git rebase). git fetch безопаснее для проверки: можно посмотреть что пришло, прежде чем сливать.

Что происходит при конфликте слияния? Git останавливается и маркирует конфликтующие строки в файлах. Вы редактируете файлы вручную, затем git add + git commit для завершения.

Когда использовать git pull --rebase? Когда хотите получить линейную историю и избежать merge-коммитов. Особенно удобно для feature-веток. Некоторые команды требуют --rebase как стандарт.

Как отменить неудачный pull? Если возникли конфликты и вы хотите отменить — git merge --abort. Если pull уже завершён и хотите отменить — git reset --hard HEAD~1 (осторожно!).

Безопасно ли выполнять git pull с незакоммиченными изменениями? Зависит от ситуации. Если изменения не конфликтуют — всё пройдёт хорошо. Если конфликтуют — Git откажет. Лучше закоммитить или сохранить через git stash перед pull.

Почему некоторые избегают git pull и предпочитают git fetch? git pull автоматически сливает изменения, что может стать неожиданностью. git fetch + ручной git merge даёт больший контроль. Оба подхода рабочие.

Заключение #

git pull — обязательная команда для командной работы. Выполняйте её в начале каждого рабочего дня и перед тем, как начать новую задачу — чтобы работать с актуальной версией кода.

Для линейной истории используйте git pull --rebase. При конфликтах — не паникуйте: git status покажет проблемные файлы, редактируете, git add, git commit.

Связанные команды: «git push: отправить код на сервер» и «git merge: объединение веток».