Как отменить два последних комита без потери локальных изменений?
Можно ещё просто объединить эти комиты через rebase:
git rebase -i HEAD~2
И пометить один из комитов на squash.
В данном случае это ничем не лучше чем reset --soft, просто более гибкий инструмент.
Очень просто. Вот один из способов.
git reset --soft HEAD~2 # отменить два последних коммита
# с опцией --soft состояние проекта в рабочем каталоге не изменится и ничего не потеряешь
# и все локальные изменения после первого коммита автоматически поместятся в индекс
git commit # создать коммит заново.

В следующий раз вместо того, чтобы создавать дополнительный исправляющий коммит, просто пересоздавай предыдущий «плохой» коммит с помощью команды git commit --amend