My current usage of git could be described as "commit early and often". I certainly attempt to make each commit a single logical unit (as discussed in good commit criteria). However, I'm often iterating a design and wish to save each stage. If I come up with something ugly but functional, I want to commit that checkpoint before cleaning things up.
What is your experience in this matter - has it caused issues for your team? Going beyond ugly code - is it acceptable to locally commit broken code as long as you don't push until the bugs are fixed?