问题:
下面:
b1 = svn branch 1
b2 = svn branch 2
我无法理解其中的区别:
如果我将branch b1
与branch b2
如果我通过使用meld或over compare等工具来区分b1 and b2
来创建补丁,然后在b2
上应用该补丁
完全相同/相似吗?
如果是,那么为什么我可以step 2
离线[没有互联网]而step 1
只能通过svn merge
在线完成?
请解释!!
答案 0 :(得分:0)
这是一个示例,显示了差异和合并之间的根本区别(我们甚至没有谈论SVN):
假设您在b1和b2中都有一个文件F. F在b1中有一个额外的行,但在b2中没有。根据您是diff b1/F b2/F
还是diff b2/F b1/F
,差异会为您提供不同的结果。在一种情况下,它会告诉你该行被删除,而另一种情况 - 它已被添加。那么你打算申请哪个补丁呢?
合并(即使它是常规的no-svn合并)是相对于第三个源 - 通常是共同的祖先 - 完成的。然后你通常可以判断是否添加或删除了该行 - 如果它在祖先中被删除,如果没有 - 则添加。
换句话说,合并是从两个 b1和b2应用更改。简单的差异无法知道发生了什么变化 - 没有第三个来源。
现在,如果你确实有共同的源 - 你可以实现类似于svn merge的结果。你甚至可以争辩说,有时SVN是一种真正的害虫,当你对两个分支应用完全相同的变化时,你会发出冲突。从理论上讲,当离线合并无法给出正确的结果时,可以提供示例,它们主要适用于不识别冲突。除了SVN做了一些有用的bookeeping合并。
因此,如果绝对必要,您可以这样做:保留公共来源b的副本;当你需要将b1合并到b2:diff b1 b
并将补丁应用到b2。
更好(正如我之前提到的)使用Git或Mercurial。