We aim not to make long and complicated rules for using Git, but we (and apache) want to have transparency, so a few rules is needed
Do not rewrite history on our branches, we want to have a liniar history without manipulation
We use 2 branches constantly:
If you make changes to any API or work on a bigger feature make an "experimentXYZ" remote branch, in order for other developers to view your code before committing it to master
Use a local work branch while you develop, once you have finalized and tested the feature/bug fix, merge it with --squash to master
Please see Git FAQ