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`).