So, I've been scratching my head for a couple of days trying to come up with an efficient way to manage Releases/Iterations with TFS branches.
Here's the situation:
We have a project for which we have releases, and for each release we have iterations. Releases are the new versions that we put into production and iterations are just development phases that need to be tested in QA.
Iterations are a bit like features. Let's say you want to develop a web site to show items (iteration 1), and then sell them (iteration 2) and package it all in the first release. For the QA fix, it is done in the iteration branch and merged in QA. Since we don't commit in QA there's no conflict to resolve when we merge.
So the workflow looks like this (a lot of parallel work needs to be done because of the tight schedule):
- For Release 1
- Start the development of Iteration 1
- Start the development of Iteration 2
- Iteration 1 goes into QA
- Start the development of Iteration 3
- Iteration 1 QA is done
- Iteration 2 goes into QA
- Release 2 starts...
In resume, lots of parallel development, one iteration in QA at a time, when all the release's iteration went through QA it goes to production.
So we need to come up with a branching solution that allows to easily merge between development branches, and then go into a QA branch. So far, we came up with this branch structure
- Main
|- QA_Release_1
| |- DEV_Iteration_1
| |- DEV_Iteration_2
| |- DEV_Iteration_3
|- QA_Release_2
|- ...
With this, we can easily merge between dev branches. But at some point when iteration 1 QA comes to an end, we disable the branch (either by deleting it, or deny acces to check out/in). When that time come, the strategy is to reparent the DEV_Iteration_2
to QA_Release_1
.
For this to be done, we need to make a baseless merge, which creates a lot of conflicts. And if I understand correctly, a baseless merge is just a folder compare, without taking into account the change set merges that happened before.
So I guess the first question would be how much merge trouble (if any) are we getting ourselves into by doing this? Is it OK to just ignore the enormous merge and just fix the tons of conflicts when reparenting?
Second would be: is there any more efficient way to achieve that goal?
Edit: I miss git...
We continued searching for a solution, and a coworker sent me this link:
Which is, if you take out what's directly related to git, exactly what we need to do. It would probably look like this in TFS:
- Main
|- Develop
|- QA_Release_1
|- DEV_Iteration_1
|- DEV_Iteration_2
|- QA_Release_2
Problem is, TFS doesn't like skipping branches. As soon as you don't merge in the parent or a child, it's considered as a baseless merge. So since the QA_Release_1
is created under Develop
, it won't easily merge into the Main
. This brings me back to my first question: are baseless merge a trap?