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 по умолчанию); нужно явно менять команды

Связанные темы

Ресурсы