Branching and merging is one of the most nerve-racking activities for people working with Subversion. Unlike Mercurial and other DVCS where branching and merging is commonplace, typical workflows in Subversion do not include this activity. As a result, the terminology is typically confusing, the massive number of changes can be scary, and a lot of people are so concerned about "getting it right" that they typically just avoid the practice altogether and work completely outside of source control. That, of course, is the exact opposite of what we need when working on an important design spike or critical new feature.
Conceptually, what we want with a design spike or large new feature is to:
- Create a new branch for the change
- Work in the new branch, committing early and often
- Periodically pull in (merge) the changes from the project trunk
- When complete, reintegrate the branch into the trunk
Creating a new branch:
- Right-click on the directory you want to branch. Pick the Branch/Tag operation.
- On the branch/tag screen, enter a new branch (typically the repository has a /branches folder as well as a /trunk folder). The new branch is typically /branches/mynewbranch, where the branch name itself is a folder that does not exist in the repository.
- In this scenario, you will also want to choose "switch working copy to new branch/tag". We'll be doing work on the new feature or design change immediately, so this tells subversion that any new commits will be on that other branch.
Work in the new branch, committing early and often
This is standard subversion behavior.
Periodically pull in (merge) the changes from the project trunk
You'll want to keep track of the last revision you've pulled changes from. In the beginning, this revision number is the revision that represented the branch itself.
- Pick the Merge tool off the TortoiseSVN menu.
- Choose the "Merge a range of revisions" from the first screen of the wizard.
- In the "URL to merge from", choose the trunk.
- In the Revision range to merge, the best approach is to be precise. Put in the last revision number that was merged (e.g. if you branched when the repository was at revision 10, put in 11-HEAD). You can leave this blank, but we want to avoid merging a change twice. You may need to look at the log to help find the right revisions.
Reintegrate the branch into the trunk
- Commit all branch changes
- Switch the working directory back to the trunk. This is done via the TortoiseSVN switch command.
- Pick the Merge command off the TortoiseSVN menu as before. This time, however, we'll pick the "Reintegrate a branch" option.
- In the "From URL" field, put the URL to the branch you've finished working on.
- Test the merge and if happy, perform the merge, test the changes, and commit to the trunk.