One of my pet peeves with git (and systems both similar, and based on it) is that automated tests run after you've made the commit and push.
In my mind the commit (let alone the push to a publicly accesible server) should be done after, and only if, the automated tests are successfully executed. And there's no easy way to implement this, other than having a dirty branch that you discard after rebasing onto a more long lived one.