At my office, we are transitioning away from Visual Source Safe (6.0!) to Mercurial and I am trying to figure the best "Mercurial" way of handling our situation. Currently, in any given project repository, we maintain multiple versions of it: i.e. for Project A, we have a VSS Repo for ProjA-Dev, ProjA-Rel1, and ProjA-Rel2 (a dev repo and one for each of the past two releases).
As it stands now, (nearly) all new work is carried out in the dev repo, then changes that are deemed necessary to be rolled back to Rel1 or Rel2 are done so by hand (files checked out of VSS to their own working directory, then using some diff tool only copying the appropriate changes). At some point, it is deemed that a new release will come out, so the dev repo is cloned and it becomes Proj*-Rev1, and the previous Proj*-Rev1 becomes Proj*-Rev2, and Proj*-Dev just goes on as if nothing has happened. It seems to me that there must be a better way to accomplish this in a much more modern tool such as Mercurial.
My current thought is that each project should have its own repository and the Dev/Rel1/Rel2 distinctions are best handled by different named branches. However, what I cannot figure out/see/wrap my head around is how to accomplish our current workflow under such an environment. If we follow our current workflow, then work continues unabated in the dev-branch and certain changes (not all!) are rolled back/over to the Rel branches. I know this can be accomplished via the transplant/graft functionality of Mercurial, which doesn't yet seem to be nicely supported in TortoiseHg. And, more importantly, past answers seem to suggest that the best solution to this is to not allow things to get into such a state to begin with 1.
Question is, what is the best way to avoid such a state given the current workflow? I have read numerous guides about Mercurial and branching (including many, many responses found on here) but have not seen a clear cut answer to this question.