当从我的开发团队的主干执行'svn merge'到分支时,我们偶尔会遇到合并冲突,这些冲突产生带有后缀名称的文件:*.merge-right.r5004
,*.merge-left.r4521
和*.working
。我在整个Subversions的文档中都进行了搜索,但是他们的解释并没有多大用处。我收集了以下内容:
我似乎无法弄清merge-left.r4521
是什么。如果答案是它只是分支的文件的旧版本,那么为什么4521?
答案 0 :(得分:44)
假设有两个分支,分支A中的最后一个(HEAD)修订版本为9,而分支B中的修订版本为6.
运行cd B; svn merge -r 5:8 ^/braches/A
时,svn会尝试在分支B顶部的分支A中应用5
和8
之间的增量。
(换句话说,变更集7和8将应用于B)
common
ancestor left right
(1)━━┱───(3)──(5)──(7)──(8)──(9) # branch A
┃ └┄┄┄┄┬┄┄┄┄┘
┃ ↓
┗━(2)━━(4)━━(6) # branch B
working
如果三角洲干净利落,那就很好了。
假设在变更集3中修改了一些行,并且在变更集4中修改了相同的源行。
如果delta(5→8)没有触及那些线,那么一切都还是不错的。
如果delta(5→8)也修改了3和4所做的,则无法自动合并更改,并且svn将文件保留为冲突状态:
如果你手动编辑这样的文件,你有几个选择---保持“工作”(你的版本),保持“正确”(他们的版本;其他分支版本)或手动合并更改。
“左”本身并没有用,没有必要在文件中保留“左”(旧版本)。
然而,它对工具很有用。 “左→右”是变更集。当你看到,例如:
<<<<<<< .working
foo = 13
||||||| .merge-left.r5
foo = "13"
=======
foo = "42"
>>>>>>> .merge-right.r8
它告诉您,"13"
已更改为分支A中的"42"
。
分支B有13
(整数,不是字符串)。
最有可能的是,您的手动合并选择是将13
更改为42
并保持整数。
答案 1 :(得分:13)
file.merge-left.r4521是左侧分支(即原点)中此文件的最新更改在右侧分支(目标)创建之前。
换句话说,merge-left.r4521它是要合并的文件的第一个版本
with 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
答案 2 :(得分:9)
这个问题类似于stackoverflow.com/questions/1673658/svnmerge-workflow,但这个问题更具体地说明了冲突文件的内容。
答案 3 :(得分:0)
似乎&#34;离开&#34; file是trunk和branch中文件相同的最后一个版本(对于你的问题,但它通常在source和dest之间)。
如果您从未将主干中的更改合并到您的分支中,那么当执行分支(副本)时,这将是主干的版本。否则,它是已合并并提交到此分支的中继的最后一个版本。
左侧和右侧是用于创建将作为补丁应用于工作文件的差异的内容。
答案 4 :(得分:-2)
您执行了3方合并投注冲突解决(合并 2个不同文件时)。这个操作使用了3个来源
r ***扩展只是添加到相同的文件名,以便在合并时有3个文件
成功合并并标记冲突后,解析后的临时文件必须自动消失,如果我的记忆能很好地为我服务