Subversion -- Copying Changes Between Branches
Copying specific changes between branches is covered well in
Chapter 4 of Version Control With Subversion, but I thought a real-life example might be helpful to some people.
I use version control for mantaining the PHP code for the Computational Lingustics database. I made a small, cosmetic change to the table-generating code in a file called searchcorpus.php, in the trunk branch. I wanted to backport it to release-2.2. Here is the sequence I used. Throughout this procedure my current directory was inside my working copy of release-2.2.
Step 1: Locate the correct revision number.
$ svn log svn://lemur.ling.washington.edu/admin/compling-database/trunk/searchcorpus.php
------------------------------------------------------------------------
r196 | brodbd | 2007-10-25 15:31:05 -0700 (Thu, 25 Oct 2007) | 1 line
searchcorpus.php: Improve look of tables by inserting instead of empty fields.
------------------------------------------------------------------------
r106 | brodbd | 2007-10-16 16:38:04 -0700 (Tue, 16 Oct 2007) | 1 line
...
Now I know I want revision 196.
Step 2: Merge in the change.
$ svn merge -c 196 svn://lemur.ling.washington.edu/admin/compling-database/trunk/searchcorpus.php
U searchcorpus.php
This pulled in the changes to searchcorpus.php from revision 196 (and only revision 196) of trunk and applied them to my working copy. I then ran
svn diff searchcorpus.php to make sure the merge did what I wanted. If not, I could have used
svn revert to back out the changes.
Step 3: Commit the change.
$ svn commit -m "searchcorpus.php: Backport cosmetic fixes from trunk r196."
Sending searchcorpus.php
Transmitting file data .
Committed revision 197.
Notice that my commit message indicates I'm importing changes from a specific revision number of another branch. This kind of bookkeeping is important in a complex project to make sure you don't accidentally merge the same change twice.
While this case is a simple one involving only one file, this same concept works for revisions that encompass multiple files or even whole directory trees, including file additions or deletions. This gives
svn merge a bit of an edge over
svn diff followed by
patch when porting complicated changes.
--
DavidBrodbeck - 25 Oct 2007