The flow goes like this for me:
- Make small amount of new code backed by tests in a feature branch
- Run some tests locally (not all)
- Push to the feature branch
- CI will run all the tests
- If a test fails, I get a notification about it in my IDE and can fix it immediately
I personally enjoy having staging area (and IDE supported local stash) that help me keep small amount of difference to the origin for development purposes.