Интерактивный rebase — Переписывание истории как профессионал
Интерактивный rebase (git rebase -i) — один из самых мощных инструментов Git. Он позволяет редактировать, переупорядочивать, объединять и удалять коммиты перед публикацией вашей работы.
Зачем нужен интерактивный rebase?
Перед отправкой ветки вы можете захотеть:
- Объединить (squash) несколько мелких коммитов "WIP" в один чистый коммит
- Переформулировать (reword) сообщение коммита с опечаткой
- Переупорядочить коммиты для более логичной истории
- Удалить (drop) коммит, который больше не нужен
Как это работает
git rebase -i HEAD~3
Это открывает редактор с последними 3 коммитами (от старых к новым):
pick a1b2c3d Add user model
pick e4f5g6h Fix typo in user model
pick i7j8k9l Add user validation
Вы меняете ключевое слово действия в каждой строке:
| Действие | Что делает |
|---|---|
pick | Оставить коммит как есть |
reword | Оставить коммит, но изменить сообщение |
squash | Объединить с предыдущим коммитом (совместить сообщения) |
fixup | Объединить с предыдущим коммитом (отбросить это сообщение) |
drop | Полностью удалить коммит |
edit | Приостановить для изменения коммита |
Типичные сценарии
Объединение WIP-коммитов
До:
pick a1b2c3d Add login page
pick e4f5g6h WIP: fix styling
pick i7j8k9l WIP: more styling fixes
После редактирования:
pick a1b2c3d Add login page
fixup e4f5g6h WIP: fix styling
fixup i7j8k9l WIP: more styling fixes
Результат: один чистый коммит "Add login page" со всеми исправлениями стилей внутри.
Переупорядочивание коммитов
До:
pick a1b2c3d Add tests
pick e4f5g6h Add feature
pick i7j8k9l Fix feature bug
После редактирования:
pick e4f5g6h Add feature
pick i7j8k9l Fix feature bug
pick a1b2c3d Add tests
Золотое правило
Как и с обычным rebase: никогда не выполняйте интерактивный rebase для коммитов, которые были отправлены в общую ветку. Это переписывает историю и вызовет проблемы у коллег.
Попробуйте!
В этом упражнении мы имитируем эффект интерактивного rebase с помощью amend и reset:
-
Создайте три коммита:
echo "feature" > feature.txt && git add feature.txt && git commit -m "Add feature"echo "feature v2" > feature.txt && git add feature.txt && git commit -m "WIP fix"echo "feature v3" > feature.txt && git add feature.txt && git commit -m "WIP fix 2"
-
Теперь объедините последние два с первым с помощью reset:
git reset --soft HEAD~2git commit --amend -m "Add feature (complete)"
-
Проверьте:
git log --oneline— вы должны увидеть один чистый коммит
Когда использовать интерактивный rebase
- Перед открытием PR — наведите порядок в истории коммитов ветки
- После code review — объедините fixup-коммиты
- Когда коммиты расположены в нелогичном порядке — переупорядочьте их
Ключевые моменты
git rebase -iпозволяет редактировать несколько коммитов за раз- Используйте
squash/fixupдля объединения коммитов - Используйте
rewordдля исправления сообщений - Используйте
dropдля удаления коммитов - Всегда делайте это до отправки в общие ветки