This is the way we do and it works well for us...
Project
|
+--01-Development
| |
| +--Release1.0
| | |
| | +--Solution Files
| |
| +--Release2.0
| |
| +--Solution Files
|
+--02-Integration
| |
| +--Release1.0
| | |
| | +--Solution Files
| |
| +--Release2.0
| |
| +--Solution Files
|
+--03-Staging
|
+--04-Production
well you get the idea...
NOTE: This is the directory structure in Team Foundation Server Branches exist only between 01-Development/Release1.0 and 02-Integration/Release1.0,
02-Integration/Release1.0 and 03-Staging/Release1.0,
03-Staging/Release1.0 and 04-Production/Release1.0
In other words you wouldn't be able to merge 03-Staging/Release1.0 to 04-Production/Release2.0, etc...
What this does for us is we have 4 seperate environments Development, Integration (alpha server), Staging (beta server), Production.
Code starts in development starts in development and then gets promoted as it test by QA (integration/alpha) and users (Staging/beta) and finally to production.
Features/changes are collected and grouped into releases that occure every few months.
But lets say you are in development for Release2.0 and you get a production issue on Release1.0... I easily can get latest version of Release1.0 and fix the issue and promote it up without effecting anything that I have been working on for Release2.0
Not saying this will work for everyone in every situation but this works very well for us.