Шаг 1а: сплющивание через rebase -i Под git squash вы наверное понимаете git rebase --interactive с последующим выбором опции squash. Действительно, можно сделать так:
Ребейз к третьему коммиту с конца (пред-предпоследнему)
git rebase -i HEAD^^ откроется такой документ:
pick 7423f96 сообщение предпоследнего коммита pick 91e9b6e сообщение последнего коммита
... Чтобы объединить два коммита в один нужно сделать squash последнего в предпоследний:
pick 7423f96 сообщение предпоследнего коммита squash 91e9b6e сообщение последнего коммита А потом сохранить документ и выйти из редактора. Откроется новый документ, в котором можно написать сообщение для вновь полученного коммита. По умолчанию там будет:
сообщение предпоследнего коммита
сообщение последнего коммита Закомментированные строки не войдут в сообщение. Если оставить пустую строку, то rebase будет прерван.
Шаг 1б: сплющивание через reset Поскольку нужно объединить N последних коммитов, отлично подойдёт более простой способ:
git reset .
git reset --soft HEAD^^ Произошло следующее:
текущая ветка переставлена на коммит HEAD^^, т.е. на два коммита назад. изменения всех коммитов вплоть до, но не включая HEAD^^ собраны в индекс Можно сделать новый коммит:
git commit -m'message' В отличие от способа с rebase, информация об авторе и дате оригинального коммита не сохраняется. Лучше не ребейзить таким образом чужие коммиты, т.к. информация об авторстве обычно важна.
Шаг 1в: комбинированный подход Предположим, что в предпоследнем коммите у вас написано нормальное сообщение, раскрывающее суть изменений. А в последнем вы исправили опечатку. Т.е. было бы удобно объединить два коммита, оставив сообщение от предпоследнего.
git reset . git reset --soft HEAD^
git commit --amend --no-edit Шаг 2. запушить на удалённый репозиторий Поскольку вы переписали свою ветку, нужно будет запушить с -f.
git push -f origin mybranch
https://ru.stackoverflow.com/a/593067