Stuck? Reach for fixup. Got something to say? squash.

When you change pick to fixup in git rebase -i, its twin sits right below it: squash. Both fold the change into the previous commit. The only difference is what happens to the message afterward: fixup throws it away, while squash lets you rewrite it.
The rule of thumb is simple. For little touch-ups that do not deserve their own line in the story ("oops, forgot to stage that," "just a typo") reach for fixup. When you are combining several commits into one and want to give it a proper new name, use squash. If your WIP commits are only pieces of Add contact page, fixup, which swallows their throwaway messages, is the perfect fit.
In real projects there is an even smoother move. The moment you spot a commit that needs a fix, commit it with git commit --fixup pointing at the target. Later, git rebase -i --autosquash lines those tagged commits up right under their target, already marked as fixup, so you never reorder the todo by hand. Once fixup feels natural, give this a try. Your cleanups will get noticeably slicker.
