JasonDaly.name

PHP, Ruby, Symfony, Rails, Doctrine, MooTools. Web Development.

Posts tagged with "development"

May 13, 2010

Subversion: Merging from trunk to branch; Back to trunk

During a normal development cycle, multiple branches of trunk may exist simultaneously with different features/fixes being developed within each. In order to keep trunk relatively stable at all times, it is a good idea to merge any changes to trunk since the branch was created into that branch when the branch is ready to be pushed into trunk. Confusing? The process is as follows

  1. Create a branch
  2. Develop new feature/fix in the branch (other developers are doing the same in their respective branches)
  3. Once finished with the branch
    1. Merge changes to trunk since the branch was created into the branch
    2. Fix any conflicts/bugs that arise from the newly added functionality from the trunk changes
    3. Merge the completely resolved and tested branch back into trunk

This is by no means the only way to manage development of a new feature/fix within Subversion, and I make no claim that it is the best. This is simply what works for my team at work presently. The end of the process described above (starting with 3) looks as follows

$ cd /path/to/branch
$ svn log --stop-on-copy # Run this from within the branch root - notice the revision # when the log output stops
$ svn merge -r ###:HEAD /path/to/trunk . # Here ### is the revision number from above

# Resolve any conflicts and test all code again in the branch
# Now to get the changes from the branch merged successfully back into trunk

$ cd /path/to/trunk
$ svn merge /path/to/branch -r ###:HEAD --accept theirs-full
$ svn resolve -R --accept working *
$ svn ci -m "Merging branch ____ into trunk" # Commit the branch merge into trunk

The 2nd and 3rd from last lines above are the ones of interest; they are the ones responsible for getting the work back into trunk. These lines are really only necessary since we had first merged work from trunk into the branch. The first line

$ svn merge /path/to/branch -r ###:HEAD --accept theirs-full

merges all changes from the branch since it was created back into trunk. This includes all code merged from trunk to the branch, so we are guaranteed that the branch has the latest and greatest of all code. As such, we force SVN to resolve all conflicts by accepting the branch copy’s version of every file within our working trunk copy. The next line

$ svn resolve -R --accept working *

Resolves any tree conflicts that have been introduced.

Tags: svn subversion code development bash trunk branch merge resolve