Команда
git rebase -i HEAD~3
откроет интерактивный редактор rebase, который позволит вам переписать последние 3 коммита в текущей ветке. По умолчанию, редактор предложит следующий список коммитов, отсортированных от старого к новому (снизу вверх в файле):
pick [SHA1 коммита 1] [Сообщение коммита 1]
pick [SHA1 коммита 2] [Сообщение коммита 2]
pick [SHA1 коммита 3] [Сообщение коммита 3]
# Rebase [SHA_родитель_коммита_1]..[SHA_коммита_3] onto [SHA_родитель_коммита_1]
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like squash, but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, you'll abort the rebase.
#
# Note that empty commits are commented out
Применив указанный вами сценарий (pick → squash → reword), файл будет изменен следующим образом:
pick [SHA1 коммита 1] [Сообщение коммита 1]
squash [SHA1 коммита 2] [Сообщение коммита 2]
reword [SHA1 коммита 3] [Сообщение коммита 3]
Что произойдет после сохранения и закрытия файла:
-
Коммит 1 будет применен без изменений (
pick
).
-
Коммит 2 будет объединен с коммитом 1 (
squash
). Git откроет редактор для объединения сообщений этих двух коммитов.
-
Коммит 3 будет применен, но Git откроет редактор для изменения сообщения коммита (
reword
).
Результат:
* В истории будет только 2 коммита вместо 3.
* Первый коммит (изначально коммит 1) будет содержать изменения как изначального коммита 1, так и изначального коммита 2, а его сообщение будет результатом объединения сообщений коммитов 1 и 2.
* Второй коммит (изначально коммит 3) будет содержать изменения изначального коммита 3, но с отредактированным сообщением коммита.
Важно помнить:
* Интерактивный rebase изменяет историю коммитов. Не используйте его на публичных ветках, чтобы избежать проблем у других разработчиков.
* При конфликтах во время rebase, вам потребуется их разрешить и выполнить
git add .
, а затем
git rebase --continue
.
* Если вы хотите отменить rebase, используйте
git rebase --abort
.