2

问题:

这里:

b1 = svn branch 1
b2 = svn branch 2

我无法理解以下方面的区别:

  1. 如果我将一个branch b1branch b2

  2. 如果我通过使用 meld 或 Beyond compare 之类的工具进行差异化创建补丁b1 and b2,然后将该补丁应用到b2

那是完全相同/相似的吗?

如果是,那为什么我可以step 2离线[没有互联网]而step 1只能在线完成svn merge

请解释 !!

4

1 回答 1

0

这是一个示例,显示了差异和合并之间的根本区别(我们甚至没有谈论 SVN):

假设您在 b1 和 b2 中都有一个文件 F。F 在 b1 中有一个额外的行,但在 b2 中没有。根据您diff b1/F b2/Fdiff b2/F b1/F. 在一种情况下,它会告诉您该行已被删除,在另一种情况下 - 它已被添加。那么你要应用哪个补丁呢?

合并(即使是常规的 no-svn 合并)是相对于第三个源完成的——通常是共同的祖先。然后您通常可以判断该行是添加还是删除 - 如果它在祖先中,则它被删除,如果不是 - 添加。

换句话说,合并是应用来自b1和 b2 的更改。简单的差异无法知道发生了什么变化 - 没有第三个来源。

现在,如果你也有共同的来源 - 你可以实现类似于 svn merge 的结果。你甚至可以争辩说,有时 SVN 是一个真正的害虫,因为当完全相同的更改应用于两个分支时,你会尖叫你有冲突。理论上,当离线合并不会给您正确的结果时,可以提供示例,它们主要适用于不识别冲突。此外,SVN 还对合并进行了一些有用的簿记。

因此,如果绝对必要,您可以这样做:保留公共源 b 的副本;当您需要将 b1 合并到 b2 中时:diff b1 b并将补丁应用于 b2。

更好的是(正如我之前提到的)使用 Git 或 Mercurial。

于 2012-05-04T07:41:31.467 回答