[cvsnt] But... (was: No conflict when merging, where one is expected)

John Peacock jpeacock at rowman.com
Thu Sep 4 15:24:27 BST 2003


Mike Lehmann wrote:

> Well, deleting the file is nearly the same as removing all lines from 
> it. Removing all lines, means "modifying" all lines. So in the 
> main-trunk and the branch, the same lines were touched and CVS *cannot* 
> know, how to solve it. Just ignoring the changes of the branch is wrong, 
> because there is loss of information.

At the risk of continuing this discussion even further, I think there is some 
misunderstanding about the nature of merge and conflict handling (in general, 
not just CVS).  An empty line has no text, hence it cannot cause a conflict; 
only the same line in both files with different textual changes can cause a 
conflict.  A deleted file, under some circumstances, can be considered to be a 
file with only empty lines.

When you merge changes from a branch to HEAD(1), essentially what CVS does is 
find the difference between the branch's root (where it split from HEAD) and the 
tip of the branch (where it is today).  That diff file is then applied to the 
files in HEAD.  If HEAD has not had any independent changes, this diff should 
never cause a conflict.  If a file in HEAD has changed (and been committed since 
the branch was made), a conflict will occur only if the same line has two 
different non-null text values.  A deleted line in one file, will not(2) cause 
any conflict, since the text only exists in the other file.

Similarly, if a file is deleted on a branch, then when applying those changes to 
HEAD, the file will be deleted on HEAD.  If a file is deleted on HEAD, but not 
on the branch, it will be recreated on HEAD during the merge, since it does 
exist on the branch.  There is no conflict in either case since the "other" file 
is empty, and hence cannot cause a conflict.

Rereading your original posting, the problem is that you created the tag, then 
deleted the file from HEAD.  The branch now contains a file which no longer 
exists on the HEAD branch.  If you are going to use branching to perform large 
scale changes (like deleting or moving files), you should not also make changes 
to HEAD, as it will cause exactly the kind of conflict you see here.

The following links discuss conflicts and merging quite lucidly:

http://cvsbook.red-bean.com/cvsbook.html#Detecting_And_Resolving_Conflicts
http://cvsbook.red-bean.com/cvsbook.html#Merging_Changes_From_Branch_To_Trunk
http://cvsbook.red-bean.com/cvsbook.html#Going_Out_On_A_Limb__How_To_Work_With_Branches_And_Survive_

That last link has especially useful information for dealing with branches.

HTH

John
--
1) Repetitive merges from a branch requires special handling, because you only 
want to apply changes that were not already made, see

http://cvsbook.red-bean.com/cvsbook.html#Multiple_Merges

2) In the general case; it is possible to find conflicts if the patching is very 
complex, i.e. lots of lines added to one file and a couple of lines deleted from 
that file at the same time.  The patch program has a -F fuzz option which makes 
the code search farther afield to try and find the matching code.  If the text 
in the file is very similar, it is possible for the patching code to get 
confused about where to apply the changes.



More information about the cvsnt mailing list