We have 2 main branches, develop and master. Different branches for features will branch from 'develop'.
When developing, try making a branch from 'develop' for the feature you are working on. Once the feature is completed, merge back into develop, without merging the entire feature history to avoid cluttering the develop branch. The feature branch should then be deleted.
Where we try and make all the features work together! Once we reach a project milestone, and the whole thing runs properly without bugs, then we merge to master.
Will hold fully working versions of the project.