Based on [Chris Johnsen's answer](http://stackoverflow.com/a/5201642/1580288): I added this line to the `[alias]` section of my git config file (`~/.gitconfig`): squash = "!f(){ git reset --soft HEAD~${1} && git commit --edit -m\"$(git log --format=%B --reverse HEAD..HEAD@{1})\"; };f" <br> Usage: git squash N ... Which automatically squashes together the last `N` commits, inclusive. <br> --- <br> My previous solution was this `[alias]`: squash = "!f(){ git rebase -i HEAD~${1}; }; f" ... which required you to edit the "git-rebase-todo" file (and change `pick` to `squash`).