[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

Re: Two way merging

From: Stefan Sperling <stsp_at_elego.de>
Date: Sun, 20 Dec 2009 19:59:06 +0100

On Sun, Dec 20, 2009 at 06:02:22PM +0000, William S Fulton wrote:
> Hi,
>
> We have been doing regular two way merges from trunk to branch and
> vice-versa using svn 1.5. In 1.6 this results in tree conflicts. Is
> there any guidance on how to deal with this scenario?

I think you should try to avoid doing this.
It's possible but it makes it very hard to know what changes really went
where and when. My favourite branching strategies only use a one-way
street between any two given branches. Such strategies tend to be simpler
to understand for both humans and for Subversion, and in my experience
it's usually possible to melt down even the most complex branching
strategy to a pattern where merges are one-way streets.

> All I can find
> is the svn book, which only talks about tree conflicts wrt to
> working copies. I have a script attached demonstrating the general
> problem. It simply adds/deletes files on trunk, merges to mybranch,
> then merges back to trunk. In my possibly naive view, there really
> isn't a tree conflict at all as there have been no changes on the
> branch (other than what was merged from trunk!!). Perhaps we are not
> merging correctly? Although using --reintegrate when merging back to
> trunk removes the tree conflict problem, this can't be right option
> as we want to keep the branch going in order to make further
> releases.

You need to use --reintegrate.

After reintegrating a branch, there are two options for keeping the
branch going. An easy one, and one that requires a bit of understanding
about how Subversion implements merge tracking.

The easy one is that you 'svn remove' the branch after re-integrating it,
and then create it again by simply copying trunk to the branch name again.
That will work fine but you'll have to use the peg revision notation
to get at the branches you deleted in the past.

The other way is to do a record-only merge.
Let's say you created your branch in revision A, and now you just
committed revision B which made the final change to your branch
before reintegration. As you do the reintegrate merge, you commit
revision X which affects trunk -- it puts all changes you made on the
branch between A and B into trunk. So we can say that, from a semantic
point of view, the changes made on the branch between A and B are the
same changes as the ones that were made on trunk in revision X.

The thing is that Subversion doesn't know this. All it knows are paths
and revisions. It does not remember that trunk:X corresponds to the
revisions branch:A-B. You need to tell Subversion about this yourself,
to avoid the next catch-up merge from trunk to the branch to merge
revision X (the branch already has all the changes made in X).

You can do this using the --record-only option.
In a working copy of the branch, do:

        svn merge --record-only -cX ^/trunk

This will only affect mergeinfo. Now after committing those mergeinfo
changes, you can run

        svn merge ^/trunk

in a working copy of the branch again to soak up further changes made
on trunk.

Stefan
Received on 2009-12-20 19:59:59 CET

This is an archived mail posted to the Subversion Users mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.