Here's something I'm trying:
1. Always branch and commit.
2. Push branch as a work in progress.
3. When branch seems ready to merge, make a new branch from that branch.
4. In the new branch, go crazy. Squash, reorder, whatever the heck.
5. If you screw something up royally in #4, delete that new branch and go back to step #3.
6. If CI succeeded for new branch, merge new branch.
7. Delete work-in-progress branch.
What kind of situations aren't covered by this approach?