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. Учитывайте правила совместной работы в репозитории.