4

当我使用第二个 SVN 合并选项即“重新集成分支/自动合并”时,我收到了上面的错误消息。我理解为什么会出现错误,即这是因为在创建分支时,我只是将项目从主干拖放到新分支中(使用 Repo-Browser),而不是以下技术之一:

  1. 在 Repo-Browser 中使用 Copy To 选项
  2. 使用 Branch/Tag 选项(在 Windows 资源管理器中右键单击项目并选择 TortoiseSVN/Branch/Tag)

我有三个问题:

  1. 为什么这些项目必须与祖先相关?这个问题表明,如果选择此选项,SVN 只会进行文件比较:在 SVN 中合并一系列修订与重新集成有什么区别?.
  2. 上述两个选项是否使项目与祖先相关?
  3. 项目从 Trunk 到 Branch 的简单拖放是否会使项目与祖先无关?
4

1 回答 1

14

为什么这些项目必须与祖先相关?这个问题表明,如果选择了此选项,SVN 只会进行文件比较:SVN Merge a range of revisions vs. reintegrate。

合并不仅仅是将文件更改从一个分支复制到另一个分支,它是将最后一个共同祖先与被合并的两个文件进行比较。这是一个三向合并。

假设您在主干上有一个文件:

Line #1
Line #2
Line #3
Line #4

你创建这个文件的一个分支。

在分支上,将第 4 行更改为:

Line #1
Line #2
Line #3
Line #4 FOO FOO FOO

在主干上,您将第 3 行更改为

Line #1
Line #2
Line #3 BAR BAR BAR
Line #4

Subversion 将最后一个共同祖先(任何更改之前的文件版本)与您正在合并的文件版本进行比较。如果我将主干合并到分支,Subversion 会看到我更改了主干上的第 3 行,但没有更改第 4 行。所以需要把3号线的改动带过来,但是4号线的不同是分支上的改动导致的,我不应该从主干抄过来4号线

合并后的文件如下所示:

Line #1
Line #2
Line #3 BAR BAR BAR
Line #4 FOO FOO FOO

Subversion 还考虑了以前合并的更改,以及您想要跳过的更改。它实际上是一个非常好的合并工具,除非您开始重命名文件并批量移动它们。(这应该在 Subversion 1.9 中得到纠正)。

因此,为了使合并工作,这两个文件必须共享一个共同的祖先,该祖先可以用作合并的基础。没有它,Subversion 将无法分辨出主干上更改了文件的哪些行与分支上更改了哪些行。否则,它只是将文件从一个分支复制到另一个分支。

您可以尝试--ignore-ancestry参数。这导致 Subversion 将合并视为差异。

上述两个选项是否使项目与祖先相关?

这两个选项(我认为您正在考虑--reintegrate与没有此选项)都不会使项目与祖先相关。这来自通过svn cp. --reintegratevs. w/o reintegrate 与合并必须发生的方式有关。当您从基本流(通常是主干)合并到分支流时,您正在将基本流上发生的更改合并到分支流上。这会创建新的修订。当您合并回来时,Subversion 会看到新的修订,并希望将这些修订合并回您的基本流中,重新集成选项可以避免这种情况发生。

而且,当您重新集成时,您会在基本流上创建一个新版本,就是为什么一旦使用. 您可以通过在. _ _--reintegrate--record-only--reintegrate

项目从 Trunk 到 Branch 的简单拖放是否会使项目与祖先无关?

取决于 Subversion 客户端。一些 GUI Subversion 客户端将拖放理解为svn cp,而不仅仅是将文件复制到另一个目录。但是,TortoiseSVN 通过 Windows 资源管理器工作,因此默认情况下拖放是文件系统副本。当您右键单击拖放以执行svn cp而不是 Windows 文件系统复制时,有一个选项。

于 2013-08-26T19:14:07.807 回答