What are the best practices and rules-of-thumb to follow while maintaining code? Is it good practice to have only the production ready code in the development branch, or should untested latest code be available in the development branch?
How do you guys maintain your development code and production code?
Edit - Supplementary question - Does your development team follow "commit-as-soon-as-possible-and-often-even-if-the-code-contains-minor-bugs-or-is-incomplete" protocol or "commit-ONLY-perfect-code" protocol while committing code to DEVELOPMENT branch?
Update 2019:
These days, the question would be seen in a context using Git, and 10 years of using that distributed development workflow (collaborating mainly through GitHub) shows the general best practices:
master
is the branch ready to be deployed into production at any time: the next release, with a selected set of feature branches merged in master
.dev
(or integration branch, or 'next
') is the one where the feature branch selected for the next release are tested togethermaintenance
(or hot-fix
) branch is the one for the current release evolution/bug fixes, with possible merges back to dev
and or master
That kind of workflow (where you don't merge dev
to master
, but where you merge only feature branch to dev
, then if selected, to master
, in order to be able to drop easily feature branches not ready for the next release) is implemented in the Git repo itself, with the gitworkflow (one word, illustrated here).
See more at rocketraman/gitworkflow
. The history of doing this vs Trunk-Based-Development is noted in the comments and discussions of this article by Adam Dymitruk.
(source: Gitworkflow: A Task-Oriented Primer)
Note: in that distributed workflow, you can commit whenever you want and push to a personal branch some WIP (Work In Progress) without issue: you will be able to reorganize (git rebase) your commits before making them part of a feature branch.
Original answer (Oct. 2008, 10+ years ago)
It all depends of the sequential nature of your release management
First, is everything in your trunk really for the next release? You might find out that some of the currently developed functions are:
In this case, trunk should contain any current development efforts, but a release branch defined early before the next release can serve as consolidation branch in which only the appropriate code (validated for the next release) is merged, then fixed during the homologation phase, and finally frozen as it goes into production.
When it comes to production code, you also need to manage your patch branches, while keeping in mind that:
When it comes to dev branch, you can have one trunk, unless you have other development efforts you need to make in parallel like:
Now, if your development-release cycle is very sequential, you can just go as the other answers suggest: one trunk and several release branches. That works for small projects where all the development is sure to go into the next release, and can just be frozen and serve as a starting point for release branch, where patches can take place. That is the nominal process, but as soon as you have a more complex project... it is not enough anymore.
To answer Ville M.'s comment: