I just learned of #git rebase --autosquash, which lets you easily fix up commits that aren't the latest commit (for which --amend is easier).
Example:
$ git commit -m'A cool thing'
# Commit 35354a9
# Hack hack...
$ git commit -m'An amazing thing'
# Whoops, the cool thing wasn't so cool. Glad I haven't pushed it yet.
# Fix fix...
$ git commit --fixup=35354a9
# Creates commit "fixup! A cool thing"
$ git rebase --autosquash
# Squashes commit "fixup! A cool thing" into commit "A cool thing"