【发布时间】:2012-06-25 18:52:16
【问题描述】:
在探索 Subversion 中的功能时,我尝试测试svnbook 的分支和合并一章的基本合并部分的撤消更改小节中描述的用例。我使用的是 1.6.4 版本,但该部分的文本在本书的两个版本中是相同的。
在我的工作副本目录中,我编辑了一个文件 testcode.py,每次编辑添加一行,并在每次编辑后提交。多次提交后,文件内容如下:
this is my first import to trunk. r1.
this is my first commit, first edit of testcode.py. r2.
this is another edit of testcode.py. r3.
this is an edit of testcode.py. i'll get rid of this one. r4.
this is another edit of testcode.py. keeping it. r5.
yet another edit. keeping it. r6.
存储库中的修订号与文件中的行匹配,因此在 /trunk/testcode.py@rN 中,文件的最后一行是以 rN 结尾的。我想要做的是删除以 r4 结尾的行,保持之前和之后的所有内容不变。
按照 svnbook 的 Undoing Changes 部分中的示例,我运行命令
svn merge -c -4 file:///path_to_repos/trunk
这会产生冲突(在运行该命令时,而不是在提交时),其中合并左文件包含直到第 r4 行的所有内容,而合并右文件包含直到第 r3 行的所有内容。换句话说,该命令不是删除过去的更改,而是希望将整个文件恢复到修订版 3 或 4,从而删除后续修订版(在本例中为 5 和 6)中的更改。
我在 svnbook 中阅读示例的方式是,用户撤销在修订版 303 中提交的更改并将结果提交到修订版 350 且没有冲突,我运行的命令应该生成了一个 svn 状态为 M 的文件保留除以 r4 结尾的所有行。
我是否错误地阅读了书中的示例,示例是否错误,或者是否有其他形式的用户错误我没有意识到?
【问题讨论】:
-
绝对可重现。现在需要想想为什么会这样。
-
使用
svn diff -c -4 foo.txt > foo.patch创建补丁,然后将其应用到foo.txt@HEAD可以正常工作 - 删除 r4 行。 -
所以补丁可以工作,但是“svn merge 的一个非常常见的用例”,正如 svn 书所说,一个简单的有自己的小节的,只是简单的没有不。这不会激发人们对 Subversion 的合并功能在更复杂的过程(例如重新集成分支)中的行为的信心。
-
SVN 合并是所有主要身体部位的痛苦——每个使用 SVN 的人都知道这一点。我没有足够的时间来检查在这种情况下发生了什么,但这是出乎意料的。我的直觉是它与在文件末尾进行的更改有关,但是,我还没有检查它。
-
好的,刚刚检查了如果在文件中间添加行会发生什么 - 而不是在末尾。工作正常 - 没有冲突。