TATECHATLAS
◎ Русский
Программирование

Git merge или rebase: выбор зависит от использования ветки

Как сохранить общую историю или перенести локальные коммиты на новую основу.

В этом материале

Merge объединяет истории: возможны fast-forward или отдельный merge-коммит. Rebase заново применяет коммиты на другой основе, создавая новые идентификаторы. Перед переписыванием общей ветки согласуйте действие с её пользователями.

Представьте историю до выбора команды

Пока вы сделали два коммита в feature, main тоже продвинулась вперёд. Merge объединяет линии разработки, сохраняя существующие коммиты. Если истории разошлись, обычно появится коммит слияния. Если объединять расходящиеся линии не нужно, Git может просто передвинуть указатель ветки: это fast-forward.

Rebase переносит изменения ваших коммитов на новую основу. Идентификаторы меняются, поскольку меняется происхождение коммитов. Историю может стать проще читать, но у коллег, получивших старые коммиты, теперь другая версия истории. Выбор определяется использованием ветки и правилами репозитория.

Подготовьте ветку и обновите сведения

Начните с git status: завершите незакоммиченную работу или безопасно отложите её. Затем получите состояние удалённого репозитория. git fetch origin обновляет origin/main, но не передвигает локальную main автоматически. Эта разница важна: иначе можно случайно объединяться с устаревшей локальной веткой.

В примере удалённый репозиторий называется origin, рабочая ветка — feature. Резервная ветка сохраняет ссылку на текущие коммиты перед изменением истории. Если такое имя уже занято, выберите новое. После подготовки используйте подходящий вариант merge или rebase с origin/main, а не выполняйте оба подряд без цели.

git status
git fetch origin
git switch feature
git branch backup-feature

Сохранить историю через merge

Merge подходит, когда существующие коммиты должны сохранить идентификаторы. Проверьте ветку и результаты разрешения конфликтов до завершения операции.

git switch feature
git merge origin/main

Осознанно перенести локальные коммиты

Rebase позволяет выстроить локальную ветку линейно. После конфликтов проверьте итоговые изменения и выполните нужные проверки. Незавершённую ошибочную операцию можно отменить.

git switch feature
git rebase origin/main

Разрешайте смысл конфликта, а не только убирайте маркеры

За конфликтом могут стоять две разные бизнес-логики. Прочитайте обе версии и окружающий код. Удаление строк с маркерами само по себе не показывает, какое поведение правильное. После исправления добавьте каждый разрешённый файл через git add и просмотрите подготовленный diff.

Незавершённый merge продолжайте через git merge --continue или отменяйте через git merge --abort. Для rebase используйте git rebase --continue и git rebase --abort. Rebase может остановиться повторно на следующем коммите, поскольку применяет изменения по одному. Не используйте --skip только ради исчезновения ошибки: изменения этого коммита могут потеряться.

Проверьте результат и сохраните путь к восстановлению

После объединения сопоставьте результат с ожидаемыми изменениями и выполните предусмотренные проектом проверки. Если rebase изменил уже опубликованную ветку, согласуйте обновление с коллегами. --force-with-lease помогает защититься от неожиданного состояния удалённой ветки, но не заменяет согласование и право переписывать историю.

Если ошибка обнаружилась после завершения операции, посмотрите резервную ветку и git reflog. Reflog хранит локальные перемещения ссылок и может помочь найти прежний коммит. Сначала создайте от него ветку восстановления. Не начинайте с reset --hard, когда у вас могут оставаться незакоммиченные изменения.

git reflog --date=iso

Что проверить

  • Проверьте незакоммиченные изменения.
  • Уточните, кто использует ветку.
  • Просмотрите изменения после разрешения конфликтов.

Примеры предполагают ветки feature и main. Учитывайте правила совместной работы в репозитории.

Источники

  1. Git: rebase ↗
  2. Git: merge ↗
  3. Pro Git: rebasing ↗
  4. Pro Git: branching and merging ↗
  5. Git: fetch ↗
  6. Git: reflog ↗
  7. Git: push and force-with-lease ↗
Наверх ↑