Тур по Git
История и отмена изменений / Урок 3.9

Интерактивный 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:

  1. Создайте три коммита:

    • 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"
  2. Теперь объедините последние два с первым с помощью reset:

    • git reset --soft HEAD~2
    • git commit --amend -m "Add feature (complete)"
  3. Проверьте: git log --oneline — вы должны увидеть один чистый коммит

Когда использовать интерактивный rebase

  • Перед открытием PR — наведите порядок в истории коммитов ветки
  • После code review — объедините fixup-коммиты
  • Когда коммиты расположены в нелогичном порядке — переупорядочьте их

Ключевые моменты

  • git rebase -i позволяет редактировать несколько коммитов за раз
  • Используйте squash/fixup для объединения коммитов
  • Используйте reword для исправления сообщений
  • Используйте drop для удаления коммитов
  • Всегда делайте это до отправки в общие ветки
🎯

Цель

Объедините несколько WIP-коммитов в один чистый коммит с помощью reset и amend

Terminal
$

No commits yet. Run `git init` and create your first commit.