Git
Git squash with interactive rebase
Git rebase: Clean commit history