How to squash commits and not to lose it

Признаюсь, мне нечасто приходится “сшивать” множество однотипных коммитов в один. Поэтому каждый раз, когда это происходит, я чувствую боль — приходится заново учиться. Ничего сложного нет, просто в этом механизме есть несколько контринтуитивных особенностей, из-за которых может бомбануть.
git rebase -i HEAD~N покажет последние N коммитов. Надо проставить squash для всех коммитов, кроме самого верхнего (= самого старого по времени), в который “сошьются” все остальные. То есть у самого верхнего останется pick. Совет: скорее всего у вас не настроен сторонний редактор для git, поэтому по команде rebase вы попадете в редактор vi. Следующая команда поможет вам заменить все слова pick на squash (потом не забудьте самому верхнему коммиту вернуть pick!):
ESC:%s/pick/squash/Enter
- Когда вы сохраните эти значения, git выдаст огромное сообщения для нового коммита — в нем будут перечислены все сообщения “сшиваемых” коммитов. Внимание: не удаляйте сообщения, сохраняйте всё как есть (можно изменить сообщения для pick-коммита, в который всё сольётся). Я так сперва удалил “лишние” коммит-сообщения, git сообщил что операция rebase успешно завершена, однако в локальной истории коммитов так ничего и не “сшилось”. Идиот.
- Это работает для коммитов, которые еще не запушены в удаленный репозиторий. Если вы попытаетесь “сшить” уже запушенные коммити, то операция rebase конечно сработает успешно, однако после этого git status будет явно просить вас сделать git pull. В итоге вы будете иметь историю как с кучей однотипных коммитов, так и с тем самым якобы сшитым коммитом. Не надо так.
- Чтобы в случае с уже запушенными коммитами всё было красиво, после успешного rebase небходимо сделать принудительный git push в в вашу ветку.

Useful links:
