I basically use the model described in this gist and dislike the fact that our review history is basically lost when we rebase to fix the commits. Rather than "what actually happened", we prefer logical commits so that when you run `git blame`, you can see a commit that makes sense rather than "WIP". What we really want is a code review system that has _changesets_ so that we can keep our git history clean, but also have a full history of our code review. I'm really surprised that in all of these GitHub discussions, there hasn't been much raised about their insufficient code review system.
https://reviewable.io deals with changes in this way and has no problems with rebasing, even distinguishing between deltas in the branch vs the base when diffing. Only works on top of GitHub, though, sorry. (Disclosure: I'm the founder.)
Phabricator solves this problem but it does so using patches (outside of "git"). It works pretty well but there does wind up being dependency problems if code doesn't get merged quickly enough.