Перейти к содержанию

Rebase (Перебазирование)

rebase — это альтернатива merge для объединения веток. Вместо создания коммита слияния он "переписывает" историю, перенося коммиты из одной ветки на кончик другой.

В чем разница между Merge и Rebase?

Merge: - Сохраняет полную историю со всеми ветвлениями. - Создает коммит слияния. - История выглядит как граф.

Rebase: - Делает историю линейной. - Не создает лишних коммитов слияния. - Переписывает историю (меняет хеши коммитов).

До rebase:
A---B---C (feature)
     \
      D---E (main)

После git rebase main (в ветке feature):

A'---B'---C' (feature)
             \
              D---E (main)

После переключения в main и merge (fast-forward):

D---E---A'---B'---C' (main, feature)

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

Чтобы перенести коммиты из ветки feature на вершину main:

# Находясь в ветке feature
git rebase main

Git последовательно применит каждый коммит из feature поверх последнего коммита main.

Интерактивный Rebase

Мощнейший инструмент для очистки истории перед слиянием. Позволяет: - Объединять несколько коммитов в один (squash). - Редактировать сообщения коммитов. - Менять порядок коммитов. - Удалять коммиты.

git rebase -i HEAD~3

Откроет редактор с последними 3 коммитами.

Команды в интерактивном режиме: - p (pick) — оставить коммит как есть. - r (reword) — изменить сообщение коммита. - s (squash) — объединить с предыдущим коммитом. - f (fixup) — как squash, но отбросить сообщение. - d (drop) — удалить коммит.

Пример использования для объединения коммитов "черновиков" в один чистый:

pick a1b2c3d Добавить функцию
squash e4f5g6h Исправить опечатку
squash h7i8j9k Добавить тесты

В результате получится один коммит с суммарными изменениями.

Rebase при синхронизации с удаленным репозиторием

Частый сценарий: вы работаете в ветке, а в main за это время внесли изменения коллеги. Чтобы ваша история оставалась чистой:

# В вашей фич-ветке
git fetch origin
git rebase origin/main

После этого можно сделать git push --force-with-lease (если ветка уже была на сервере).

Конфликты при Rebase

Если при перебазировании возникают конфликты, Git остановится после применения очередного коммита.

  1. Разрешите конфликт в файлах (как при обычном merge).
  2. Добавьте исправленные файлы: bash git add <файл>
  3. Продолжите rebase: bash git rebase --continue

Для отмены:

git rebase --abort

Золотое правило Rebase

Никогда не делайте rebase коммитов, которые уже отправлены в общий удаленный репозиторий и могли быть использованы другими разработчиками.

Rebase меняет историю (хеши коммитов). Если вы сделаете rebase общей ветки, у ваших коллег возникнут серьезные проблемы при слиянии.

Безопасно использовать rebase для: - Локальных фич-веток перед слиянием в main. - Очистки своих собственных коммитов до пуша.

Небезопасно: - Для веток main, develop и других общих веток. - Для веток, над которыми работают другие люди.

Когда использовать Rebase, а когда Merge?

  • Rebase: для поддержания чистой, линейной истории локальной фич-ветки перед слиянием.
  • Merge: для сохранения полной истории разработки, особенно когда важно видеть, когда и какие ветки сливались (или для слияния в общие ветки).

Назад: Конфликты → | Далее: Настройка удаленных репозиториев →