【问题标题】:Differences between svn merge left, right & working files after conflicts冲突后svn合并左,右和工作文件之间的差异
【发布时间】:2011-10-06 18:59:12
【问题描述】:

当从我的开发团队的主干执行“svn 合并”到分支时,我们偶尔会遇到合并冲突,从而产生具有后缀名称的文件:*.merge-right.r5004*.merge-left.r4521*.working。我搜索了整个 Subversions 的文档,但他们的解释并没有多大用处。我收集了以下内容:

  • *.merge-right.r5004 = 主干版本
  • *.merge-left.r4521 = ?
  • *.working = 分支版本

我似乎无法弄清楚merge-left.r4521 是什么。如果答案是它只是分支文件的旧版本,那么为什么是 4521?

【问题讨论】:

标签: svn


【解决方案1】:

假设有两个分支,分支A 中的最后一个(HEAD)修订版是9,而分支B 中是6

cd B; svn merge -r 5:8 ^/braches/A 运行时,svn 将尝试从A 分支B 顶部的分支8 应用58 之间的增量。

(换句话说,更改集78 将应用于B

common
ancestor      left     right
(1)━━┱───(3)──(5)──(7)──(8)──(9)  # branch A
     ┃         └┄┄┄┄┬┄┄┄┄┘
     ┃              ↓
     ┗━(2)━━(4)━━(6)              # branch B
               working

如果增量应用干净,一切都很好。

假设在变更集3 中修改了一些行,而在变更集4 中对相同的源代码行进行了不同的修改。

如果 delta (58) 没有触及这些线,一切都还好。

如果 delta (58) 也修改了 34 所做的,则无法自动合并更改,并且 svn 使文件处于冲突状态:

  • file --- 用 (working, left, right) 分隔的文件
  • file.working --- 分支中的文件状态 B@6
  • file.merge-left --- 分支中的文件状态 A@5
  • file.merge-right --- 分支中的文件状态 A@8

如果您手动编辑此类文件,您有几个选择 --- 保留 working(您的版本)、保留 right(他们的版本;另一个分支版本)或手动合并更改。

Left 本身没有用,没有必要在文件中保留left(他们的旧版本)。

不过,它对工具很有用。 leftright 是变更集。

当你看到时,例如:

<<<<<<< .working

    life_universe_and_everything = 13

||||||| .merge-left.r5

    life_universe_and_everything = "13"

=======

    life_universe_and_everything = "42"

>>>>>>> .merge-right.r8

在分支A"13"(str) 更改为"42"

分支B13 (int)。

当您手动协调此冲突时,您可能需要42 (int)。

【讨论】:

  • 最后,一个我能看懂的解释。谢谢!
【解决方案2】:

file.merge-left.r4521 是该文件在左分支(即原点)右分支(目标)创建之前的最新更改。

换句话说,merge-left.r4521 是要合并的文件的第一个版本

使用merge-right.r5004(目标分支的最新版本)

例如,假设你想合并左右分支如下:

Left   1   2   f.3   4   f.5   6    7    f.9    11 

Right                                  8    f.10    f.12   13


Right is created in 8 ( is a copy of 7 )

file 'f' has been modified in 3, 5, 9, 10, 12

The merge of file 'f' will occur between 7 and 13 because

7 is the latest version of file f in Left before Right was created

13 is the latest version of Right

【讨论】:

    【解决方案3】:
    • 'file.py.merge-left.rxxx`展示了取冲突左侧的合并结果
    • 'file.py.merge-right.ryyy`展示了取冲突右侧的合并结果
    • 'file.py.working` 显示未更改的工作副本
    • 'file.py` 显示 SVN 尝试合并两者

    这个问题与stackoverflow.com/questions/1673658/svnmerge-workflow类似,但这个问题更具体地说明了冲突文件的内容。

    【讨论】:

    • 您的回答表明 .merge-right 和 .working 在大多数情况下应该是一致的(当我们从“正确”的未更改结帐开始时),但这与我的观察不符。
    【解决方案4】:

    似乎“左”文件是主干和分支中文件相同的最后一个版本(对于您的问题,但它通常在源和目标之间)。

    如果您从未将主干中的更改合并到您的分支中,那么这将是执行分支(复制)时主干的版本。否则,它是合并并提交到此分支的最后一个主干版本。

    左右是用于创建将应用于(作为补丁)到工作文件的差异。

    【讨论】:

      【解决方案5】:

      您执行了 3-side merge diring 冲突解决(当合并 2 个不同的文件时)。它这个操作使用了 3 个来源

      • “你的”文件(来自 WC 或源位置,取决于参数)
      • “他们的”文件(带有更改的文件必须合并)
      • “基础”文件(文件 1-2 的共同祖先)

      r*** 扩展名刚刚添加到相同的文件名,以便合并 3 个文件

      在成功合并并将冲突标记为已解决的临时文件后,如果我没记错的话,必须自动消失

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-17
        • 1970-01-01
        • 2011-09-07
        • 2013-05-10
        • 1970-01-01
        • 2014-10-16
        • 1970-01-01
        相关资源
        最近更新 更多