为什么这些项目必须与祖先相关?这个问题表明,如果选择了此选项,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
. --reintegrate
vs. w/o reintegrate 与合并必须发生的方式有关。当您从基本流(通常是主干)合并到分支流时,您正在将基本流上发生的更改合并到分支流上。这会创建新的修订。当您合并回来时,Subversion 会看到新的修订,并希望将这些修订合并回您的基本流中,重新集成选项可以避免这种情况发生。
而且,当您重新集成时,您会在基本流上创建一个新版本,这就是为什么一旦使用. 您可以通过在. _ _--reintegrate
--record-only
--reintegrate
项目从 Trunk 到 Branch 的简单拖放是否会使项目与祖先无关?
取决于 Subversion 客户端。一些 GUI Subversion 客户端将拖放理解为svn cp
,而不仅仅是将文件复制到另一个目录。但是,TortoiseSVN 通过 Windows 资源管理器工作,因此默认情况下拖放是文件系统副本。当您右键单击拖放以执行svn cp
而不是 Windows 文件系统复制时,有一个选项。