I'm facing a peculiar problem with SVN merge
. I want to merge from a dev branch to trunk. We have multiple dev branches cut off the trunk at the same time.
I'm merging one of those branches to trunk with this command:
svn merge trunk branch_1
I see changes that are not part of this branch, getting merged into trunk. What am I doing wrong ?
SVN Version :
Subversion command-line client, version 1.6.16-SlikSvn-tag-1.6.16@1076804-WIN32.
Your svn merge
syntax is wrong.
You want to checkout a working copy of trunk
and then use the svn merge --reintegrate
option:
$ pwd
/home/user/project-trunk
$ svn update # (make sure the working copy is up to date)
At revision <N>.
$ svn merge --reintegrate ^/project/branches/branch_1
--- Merging differences between repository URLs into '.':
U foo.c
U bar.c
U .
$ # build, test, verify, ...
$ svn commit -m "Merge branch_1 back into trunk!"
Sending .
Sending foo.c
Sending bar.c
Transmitting file data ..
Committed revision <N+1>.
See the SVN book chapter on merging for more details.
Note that at the time it was written, this was the right answer (and was accepted), but things have moved on. See the answer of topek, and http://subversion.apache.org/docs/release-notes/1.8.html#auto-reintegrate
If your working directory points to the trunk, then you should be able to merge your branch with:
svn merge https://HOST/repository/branches/branch_1
be sure to be to issue this command in the root directory of your trunk
Do an svn update in the trunk, note the revision number.
From the trunk:
svn merge -r<revision where branch was cut>:<revision of trunk> svn://path/to/branch/branchName
You can check where the branch was cut from the trunk by doing an svn log
svn log --stop-on-copy
svn
(such as the one OP is using).
svn://path/to/branch/branchName
that should pull only the changes from that branch not from other branches. If so we are in the danger!
The syntax is wrong, it should instead be
svn merge <what(the range)> <from(your dev branch)> <to(trunk/trunk local copy)>
Success story sharing
--reintegrate
is indeed not mandatory but really recommended in this case. I have tried to do it without--reintegrate
and ended up with hundred of conflicts. With--reintegrate
, no conflicts and everything was good!--reintegrate
option is simple and effective, BUT it must be noted that "Once a--reintegrate
merge is done from branch to trunk, the branch is no longer usable for further work. It's not able to correctly absorb new trunk changes, nor can it be properly reintegrated to trunk again." as explained by the book you have linked.