Subversion is quite good about merging changes when two team members simultaneously edit a file. But occassionally two team members will edit the same section of the same file. Subversion isn’t “smart” enough to decide which person wrote the best code (or text, or whatever). Rather than throw out one of the changes, Subversion will report a conflict and store enough information in your working directory to allow you to resolve the problem in one of several ways.
This document describes what Subversion does when it detects a conflict and gives four different strategies for resolving the conflict.
Suppose Sally and Joe are teammates and they are both working independently on their tasks from their last team meeting. Sally and Joe both update their working copy of the team project. Sally adds a new method to a class. At the same time Joe updates the javadoc comment for a different method in the same class.
Now suppose Joe finishes his task first and commits his changes to the repository. Now the base version that Sally is working with doesn’t include Joe’s changes. When Sally finishes her task and attempts to commit her changes, she’ll receive an error message that her version is probably out-of-date. Sally then will do a Subversion update on the file to get Joe’s changes.
In our example, Sally’s and Joe’s changes are independent, so Subversion will merge Joe’s changes with Sally’s. Now the file in Sally’s working directory contains both of their changes. Sally can commit her version to the repository. If Joe does a Subversion update, now he’ll also have his changes and Sally’s.
But suppose Sally and Joe both edited the
same
method. When Sally first tried to commit her changes she would receive the
probably out-of-date
error message. When she then ran a Subversion
update, Subversion would be unable to merge the changes, since it wouldn't know whose change was the “correct” one. In this case, Subversion would report that
one or more files are in a conflicted state. In this case, Subversion will place four files in the directory where the conflicted file was. Suppose the conflicted file was called
SomeClass.java
. The four files would be:
SomeClass.java
– this file would include Joe’s changes and Sally’s changes. For each place where they both made changes Subversion will insert text like
<<<<<<< .mine
, followed by Sally’s changes, followed by the text
=======
, followed by the changes that Joe committed to the repository, followed by
>>>>>>> .r123
.
SomeClass.java.mine
– this file would include just Sally’s changes
SomeClass.java.r
N, where
N
is some number – this file would be the version that Sally started with, without her or Joe’s changes
SomeClass.java.r
M, where
M
is some number greater than
N
– this file would include just Joe’s changes
Sally would change
SomeClass.java
to incorporate the changes in whatever way seems best. This might involve consultation with Joe to see what he thinks or to clarify what changes he made and why. Sally could edit
SomeClass.java
directly to combine the marked changes and delete the
<<<<<<< .mine
,
=======
, and
>>>>>>> .r123
markers. Sally and Joe might agree that they were both trying to make the same changes and that Sally’s version is better. In that cases, Sally could copy
SomeClass.java.mine
over the top of
SomeClass.java
, throwing out Joe’s changes. On the other hand, if they agree to just use Joe’s version, Sally could copy
SomeClass.java.r
M
over the top of
SomeClass.java
. Finally, if they decided to throw out all the changes, Sally could copy
SomeClass.java.r
N
over the top of
SomeClass.java
.
After resolving the conflicted files using the above techniques, Sally must right-click on
SomeClass.java
and tell Subversion that the conflict is
resolved. Subversion will delete the extra files that it created when the conflict was detected. Finally, Sally must
commit
the file
SomeClass.java
to the repository so that Joe and her other teammates can get the current version.