On Thu, 26 Feb 2004, Iakov Glubokiy wrote:

> I'd like to discuss some thoughts about merging from a branch several
> times. AFAIU, Cederqvist ommited the tiny fact that using double -j
> one can lose some data. He says:
> 
> ====
> Continuing our example, the revision tree now looks like this:
> +-----+    +-----+    +-----+    +-----+    +-----+
> ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
> +-----+    +-----+    +-----+    +-----+    +-----+
>                 !                           *
>                 !                          *
>                 !   +---------+    +---------+
> Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !
>                     +---------+    +---------+
> where the starred line represents the merge from the ‘R1fix’ branch to
> the main trunk, as just discussed.
> Now suppose that development continues on the ‘R1fix’ branch:
> +-----+    +-----+    +-----+    +-----+    +-----+
> ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 !----! 1.5 ! <- The main trunk
> +-----+    +-----+    +-----+    +-----+    +-----+
>                 !                           *
>                 !                          *
>                 !   +---------+    +---------+    +---------+
> Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
>                     +---------+    +---------+    +---------+
> ====
> 
> well, in that certain case suggested
> 
> cvs update -j 1.2.2.2 -j R1fix m.c
> 
> works fine.
> But in more common case, when the trunk was changed too, we can
> overwrite changes in trunk by changes in the branch! Where single -j
> update produces conflict, double -j produces overwrite. Look:

That is not by design. If you actually have a test case that reproduces
an instance of overwrite, you should discuss that.

> 
> +-----+    +-----+        +-----+    +-----+    +-----+
> ! 1.1 !----! 1.2 !--...---! 1.5 !----! 1.6 !----! 1.7 ! <- The main trunk
> +-----+    +-----+        +-----+    +-----+    +-----+
>                 !               *
>                 !                 *
>                 !   +---------+    +---------+    +---------+
> Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 !----! 1.2.2.3 !
>                     +---------+    +---------+    +---------+
> 
> Here
> 
> cvs update -j 1.2.2.2 -j R1fix m.c
> 
> conflicting changes at 1.2.2.3 just discard changes at 1.6-1.7

Conflicting changes should produce conflict markers.

You should see a 3-way merge performed with 1.2.2.2 as the ancestor,
and 1.7 (your working copy) and 1.2.2.3 as the two descendants.

Your approach can produce bad merges in a different way. If you use the
tip of the branch as the second argument to -j, you have potential race
conditions between the merge and other people doing commits on the
branch:

  cvs update -j branch_x_last_merge -j branch_x

  #  resolve conflicts, commit
  #  ... meanwhile more changes are added to branch ...

  cvs tag -F -r branch_x branch_x_last_merge

  # last merge tag is moved to the tip, skipping over new changes!

Always place a stable tag at the tip of the branch, and then merge to
that. Use that tag as the starting point for the next merge.



_______________________________________________
Info-cvs mailing list
[EMAIL PROTECTED]
http://mail.gnu.org/mailman/listinfo/info-cvs

Reply via email to