Say you are working on some feature. You've changed a bunch of files, things seems to work, so time to commit. But now you realize you've been working on the wrong branch.
In my case I wanted to make a new feature branch off master (tuning a bunch of model parameters), but I was actually on another feature branch that's halfway to implement some new functionality.
So, how to fix this? I don't want to make a new commit and then rebase it. I'm sharing this repo on multiple computers, which means rebasing is not useful for me. I could save the changes a a patch, make my new branch, then apply the patch. Never look down on the simple, manual way to do things; it's not a bad idea.
But it turns out there's a better way: stash your changes; get to your new branch, then pop back the stash. Git will treat it as a regular merge, so it'll do what it can to avoid conflicts. And any conflicts that do happen you can deal with in your usual way.
$ git stash
$ git checkout master
$ git checkout -b newparameters
$ git stash apply
.. and string-instrument! you're done.
A stash is really just another commit blob, only it's added to a stack instead of to your repository tree. So you can treat it as any blob if you want. Useful!