It's useful to follow a proper branching model.
Where I work we use master as the release-production-ready code. We branch of version branches from there. So a 2.5 release will be based off of master.
We work off of develop, and branch out topical branches from there, once complete merge to develop, test, once approved merge develop towards master.
And so on and so forth. It's very clean and makes it easy to test out other developer's feature as everything is encapsulated in a branch.