Using TortoiseSVN how do I merge changes from the trunk to a branch and vice versa?

Viewed 116980

I've been reading up on branching/merging with Subversion 1.5 using the excellent and free Version Control with Subversion book. I think that I understand how to use the Subversion command line client to perform the actions that I need most often, which are:

Update Branch with Changes from Trunk

From the branch's working directory run:

svn merge http://svn.myurl.com/proj/trunk

Merge Branch into Trunk

From the trunk's working directory run:

svn merge --reintegrate http://svn.myurl.com/proj/branches/mybranch

However, we are using TortoiseSVN 1.5 as our interface to Subversion. I would like to know how best to perform these operations with TortoiseSVN. The new dialog provides three different options on the main menu.

  1. Merge a range of revisions
  2. Reintegrate a branch
  3. Merge two different trees

From what I can gather, TortoiseSVN always executes svn with the following syntax.

svn merge [--dry-run] --force From_URL@revN To_URL@revM PATH

Additionally, reintegrate a branch often fails with a message stating that some targets have not been merged and so it cannot continue, and so I had to use option #3.

My questions are:

  1. How do I use TortoiseSVN 1.5 to merge changes from the trunk to a branch?
  2. How do I use TortoiseSVN 1.5 to merge the branch to the trunk, with and without the reintegrate method?
  3. Which of the above options should I use for each, and why?

EDIT

Through "dry run" testing I have found that the command line Subversion operation

svn merge http://svn.myurl.com/proj/trunk

is analogous to option #1 (Merge a Range of Revisions) in TortoiseSVN, as long as I leave the revision range blank.

5 Answers

The behavior depends on which version your repository has. Subversion 1.5 allows 4 types of merge:

  1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
  2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
  3. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [WCPATH]
  4. merge --reintegrate SOURCE[@REV] [WCPATH]

Subversion before 1.5 only allowed the first 2 formats.

Technically you can perform all merges with the first two methods, but the last two enable subversion 1.5's merge tracking.

TortoiseSVN's options merge a range or revisions maps to method 3 when your repository is 1.5+ or to method one when your repository is older.

When merging features over to a release/maintenance branch you should use the 'Merge a range of revisions' command.

Only when you want to merge all features of a branch back to a parent branch (commonly trunk) you should look into using 'Reintegrate a branch'.

And the last command -Merge two different trees- is only usefull when you want to step outside the normal branching behavior. (E.g. Comparing different releases and then merging the differenct to yet another branch)

Take a look at svnmerge.py. It's command-line, can't be invoked by TortoiseSVN, but it's more powerful. From the FAQ:

Traditional subversion will let you merge changes, but it doesn't "remember" what you've already merged. It also doesn't provide a convenient way to exclude a change set from being merged. svnmerge.py automates some of the work, and simplifies it. Svnmerge also creates a commit message with the log messages from all of the things it merged.

Related