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 остановится после применения очередного коммита.
- Разрешите конфликт в файлах (как при обычном merge).
- Добавьте исправленные файлы:
bash git add <файл> - Продолжите rebase:
bash git rebase --continue
Для отмены:
git rebase --abort
Золотое правило Rebase¶
Никогда не делайте rebase коммитов, которые уже отправлены в общий удаленный репозиторий и могли быть использованы другими разработчиками.
Rebase меняет историю (хеши коммитов). Если вы сделаете rebase общей ветки, у ваших коллег возникнут серьезные проблемы при слиянии.
Безопасно использовать rebase для:
- Локальных фич-веток перед слиянием в main.
- Очистки своих собственных коммитов до пуша.
Небезопасно:
- Для веток main, develop и других общих веток.
- Для веток, над которыми работают другие люди.
Когда использовать Rebase, а когда Merge?¶
- Rebase: для поддержания чистой, линейной истории локальной фич-ветки перед слиянием.
- Merge: для сохранения полной истории разработки, особенно когда важно видеть, когда и какие ветки сливались (или для слияния в общие ветки).
Назад: Конфликты → | Далее: Настройка удаленных репозиториев →