Как объединить несколько коммитов в один

1,00
р.
Есть ветка, в которой последовательно лежит 13 коммитов. Есть нормальный способ их объединить?
А по сути, я могу перейти в основную ветку и перекинуть в нее только последний с помощь cherry-pick, т.к. он содержит в себе актуальную версию, что и нужно в итоге. Хотя могу ошибаться

Ответ
Пусть вы хотите склеить последние три коммита (для 13-ти коммитов процесс выглядит аналогично). Для этого есть отличный метод с использованием git rebase. Эта команда позволяет изменять историю коммитов. Алгоритм работы выглядит следующим образом:
Сделайте резервную копию. Это совсем не обязательно, но поможет сохранить нервные клетки, если что-то пойдет не так. Варианты:
Копия каталога с файлами в котором развернут git репозиторий. git branch backup или git tag backup в последнем коммите. Прочитать справку по командам reflog и reset и знать, что бэкапы уже есть.
Избавьтесь от незакоммиченных изменений (git add + git commit или git stash или что-то еще). Выполните git rebase -i HEAD~3. В ответ на это вы получите "диалог" (окно редактирования файла) вида: pick bcdca61 Second commit pick 4643a5f The third commit with cool stuff pick e0ca8b9 The last commit
# Rebase 48411de..e0ca8b9 onto 48411de # # 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
при этом, коммиты указаны в порядке возрастания времени создания (самый нижний -- самый свежий). В "диалоге" из п.2 вам нужно заменить pick на squash для двух самых свежих коммитов (две нижние строки). В примере выше, это должно выглядеть вот так: pick bcdca61 Second commit squash 4643a5f The third commit with cool stuff squash e0ca8b9 The last commit
# Rebase 48411de..e0ca8b9 onto 48411de # # ...
После этого вы должны закрыть этот "диалог" (сохранить редактируемый файл). Если для работы с git используется vi (по умолчанию), то это делается последовательным нажатием ESC, вводом :wq и нажатием Enter. В следующем "диалоге" вам предложат указать заголовок для получившегося коммита.
Вот здесь, есть развернутая информация о том, как перезаписывать историю в git.