Разбор

Пока работаешь над веткой, коммиты лучше делать часто — так всегда есть точка для отката. Но перед merge или code review ветка с десятками бессмысленных коммитов неудобна: коллегам придётся пробираться сквозь «wip», «fix», «..» и подобное.

Interactive rebase позволяет привести историю в порядок перед тем, как её увидят остальные.

Проведем рефакторинг до нужного нам коммита. Для этого копируем хеш нужного коммита, например: 75a4839. Затем запускаем rebase interactive с флагом -i.

Для того чтобы посмотреть все коммиты и информацию о них, нужно выполнить git log или git lg, подробнее тут.

git rebase -i 75a4839

Теперь мы получаем список всех коммитов, начиная от этого хеша. Мы можем увидеть ключевые слова pick, которые сообщают Git, что делать с каждым коммитом. Ниже видим доступные команды.

Давай очистим нашу историю. Например, первый коммит мы хотим перефразировать. Используем r - reword: берём коммит, но редактируем его сообщение.

В следующих двух коммитах мы хотим удалить сообщения коммитов, но при этом сохранить изменения. Используем fixup или f. Он похож на squash, который объединяет сообщение с предыдущим коммитом. fixup лог-сообщение отбрасывает.

r b0cd0a3 add intro section text
f 1cb9b9b wip: intro section
f 1972a3a ..

# Rebase 75a4839..1972a3a onto 75a4839 (3 commands)
#
# Commands:
# p, pick <commit> = use
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]

Далее закрываем редактор через :wq. Git автоматически переходит к первому коммиту, помеченному rreword. Здесь мы просто меняем сообщение коммита. Чтобы войти в режим редактирования, нажимаем i.

сообщение_коммита

# Пожалуйста, введите сообщение коммита для ваших изменений. Строки,
# начинающиеся с «#» будут проигнорированы, а пустое сообщение
# отменяет процесс коммита.
#
#
# интерактивное перемещение в процессе; над 75a4839
# Последняя команда выполнена (1 команда выполнена):
#    reword b0cd0a3 add intro section text
# Следующая команда для выполнения (2 команды осталось):
#    fixup 1cb9b9b wip: intro section
#    fixup 1972a3a ..
# Вы сейчас редактируете коммит при перемещении ветки  «имя_ветки» над «75a4839».
#
# Изменения, которые будут включены в коммит:

Затем сохраняемся через :wq. Все остальные коммиты с fixup будут автоматически объединены поверх него.