问题:
这里:
b1 = svn branch 1
b2 = svn branch 2
我无法理解以下方面的区别:
如果我将一个
branch b1
与branch b2
如果我通过使用 meld 或 Beyond compare 之类的工具进行差异化创建补丁
b1 and b2
,然后将该补丁应用到b2
那是完全相同/相似的吗?
如果是,那为什么我可以step 2
离线[没有互联网]而step 1
只能在线完成svn merge
?
请解释 !!
问题:
这里:
b1 = svn branch 1
b2 = svn branch 2
我无法理解以下方面的区别:
如果我将一个branch b1
与branch b2
如果我通过使用 meld 或 Beyond compare 之类的工具进行差异化创建补丁b1 and b2
,然后将该补丁应用到b2
那是完全相同/相似的吗?
如果是,那为什么我可以step 2
离线[没有互联网]而step 1
只能在线完成svn merge
?
请解释 !!
这是一个示例,显示了差异和合并之间的根本区别(我们甚至没有谈论 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 还对合并进行了一些有用的簿记。
因此,如果绝对必要,您可以这样做:保留公共源 b 的副本;当您需要将 b1 合并到 b2 中时:diff b1 b
并将补丁应用于 b2。
更好的是(正如我之前提到的)使用 Git 或 Mercurial。