git rebase: интерактивный
Интерактивный режим rebase позволяет переупорядочить, объединить, разделить, переименовать или удалить коммиты перед публикацией.
Зачем нужно
В процессе работы история коммитов часто выглядит грязно: «wip», «fix typo», «fix fix» и т.п. Интерактивный rebase позволяет привести историю в порядок до того, как она попадёт на ревью в Pull Request. Это мощный инструмент рефакторинга истории — можно слить несколько коммитов в один, изменить сообщения, убрать лишнее.
Где используется
- Очистка истории feature-ветки перед созданием Pull Request
- Объединение (squash) нескольких рабочих коммитов в один логичный
- Исправление сообщений коммитов (reword)
- Удаление случайно закоммиченных файлов из истории ветки
Основной контент
Запуск интерактивного rebase
# Редактировать последние 3 коммита
git rebase -i HEAD~3
# Редактировать все коммиты после точки ответвления от main
git rebase -i main
# Редактировать начиная с конкретного коммита (не включительно)
git rebase -i abc1234
Команды в редакторе
Git открывает список коммитов от старых к новым:
pick a1b2c3d feat: добавить форму входа
pick e4f5g6h wip: продолжить работу
pick i7j8k9l fix typo
pick m0n1o2p feat: добавить валидацию
# Команды:
# pick (p) — использовать коммит как есть
# reword (r) — изменить сообщение коммита
# edit (e) — остановиться для изменения коммита
# squash (s) — слить с предыдущим, объединить сообщения
# fixup (f) — слить с предыдущим, выбросить сообщение
# drop (d) — удалить коммит
# exec (x) — выполнить команду shell
Типичные сценарии
# Сценарий 1: объединить рабочие коммиты в один
# Было:
pick a1b2c3d feat: начать форму
pick e4f5g6h wip: продолжить
pick i7j8k9l fix typo
# Изменяем на:
pick a1b2c3d feat: добавить форму авторизации
fixup e4f5g6h wip: продолжить
fixup i7j8k9l fix typo
# Результат: один коммит с сообщением первого
# Сценарий 2: переименовать коммит
pick a1b2c3d некорректное сообщение
# Изменяем на:
reword a1b2c3d некорректное сообщение
# Git остановится и откроет редактор для нового сообщения
# Сценарий 3: удалить коммит
pick a1b2c3d feat: фича
drop e4f5g6h добавил отладочный код
pick i7j8k9l test: тесты
Управление при конфликтах и edit
# При использовании edit — Git останавливается на коммите
# Можно изменить файлы, добавить в staging и продолжить
git add src/app.js
git rebase --continue
# Прервать и вернуть всё назад
git rebase --abort
Публикация после интерактивного rebase
# Хэши изменились — нужен force push
git push --force-with-lease origin feature/auth
Частые ошибки
- Интерактивный rebase опубликованной ветки без согласования — хэши изменятся, другие разработчики получат конфликты
- Squash коммита с другим автором — коммиты объединятся под именем одного автора; будь внимателен при работе с чужими коммитами
- Перепутать порядок — в редакторе коммиты от старых к новым (наоборот по сравнению с
git log) - Закрыть редактор без изменений — rebase пройдёт без изменений (pick по умолчанию); нужно явно менять команды