TL;DR: 您不能删除一个 SVN 位置并将其历史分配给另一个位置,即使它们的名称相同。您可以做的是合并到正确的位置并保留所有原始历史记录。
现在,让我直说:
- 您有一个
trunk。
- 您有一个发生重大变化的分支
branch A。
- 现在
trunk 有一些小的变化。
- 您创建了一个新的
branch B 关闭branch A?真的不清楚你创建的branch B 关闭
- 您将
trunk 更改合并为branch B
- 现在您希望
branch B 成为您的trunk(换句话说,您需要将整个branch B 合并到trunk)
您为什么不直接将那些从trunk 到branch A 的细微更改合并为keeping branch in sync,然后将reintegrate branch A 合并到trunk?您应该每天保持功能分支与主干同步,越频繁越好。唯一不应该使分支保持同步的情况是,这是一个发布分支,并且您不希望其中有新的主干更改。但是根据您的问题,您确实希望trunk 更改branch A,不是吗?
branch B 在这里似乎完全多余。我对 Eclipse 一无所知,但它可能失败了,因为branch B 不是trunk 的直系后代。
表演:
- 将
branch A 合并到trunk
获得与执行相同的有效结果:
- 创建
branch B 关闭branch A
- 将
trunk 合并到branch B
- 将
branch B 合并回trunk 以保留trunk 历史记录
“branch A -> trunk”之间合并的复杂度与“trunk -> branch B(与branch A相同)”之间合并的复杂度相同
请提供branch B存在的原因,也许我在这里完全遗漏了一些观点。
你应该做的是:
- 结帐
trunk 或更新您现有的结帐
- 使用 TortoiseSVN(因为你链接了那个,而我不知道 Eclipse),右击
trunk,选择TortoiseSVN -> Merge
- 点击,下一步,提供
branch A的URL
- 点击
Show Log,选择要合并的所有修订,也可以用12121-12777指定范围
- 点击
Next
- 点击
Merge
- 解决冲突(如果有)。
- 将
trunk 提交给SVN。
上述在SVN中的commit会清楚地表明这些更改来自Branch A
如果存在冲突,您必须使用您配置的任何差异工具来解决它们。您提到的那个文件filename.java.2.working 是一个冲突解决文件。当 SVN 检测到无法自动解决的两个文件之间的冲突时,它会为您提供“您的”文件的副本、“他们的”文件的副本和“合并”文件的副本。您在“您的”和“他们的”文件之间进行选择并放入“合并文件”,然后将冲突标记为已解决。一旦标记为“已解决”,所有 3 个都将从工作场所中删除并替换为原始文件名,其中包含“合并”文件的内容。这就是然后被提交的内容。
在你的情况下又快又脏:
鉴于您已经创建了冗余的branch B 并且已经合并了trunk 更改为branch B,现在希望branch B 成为您的新trunk,您可以快速而肮脏地执行以下操作
- 结帐
trunk 或更新您现有的结帐
- 在文件系统上,右键单击您的
branch B 结帐文件夹,选择TortoiseSVN -> Export,然后导出到新文件夹
- 将新文件夹中的所有文件复制到您的
trunk 结帐(覆盖)
- 提交
trunk
以上将显示为直接提交,不会显示更改来自branch B
最后:
E.g.: Branch created at version 12121 Trunk latest 12500 Branch latest 12777.
Now when I do the merge, I want all the files to be committed at version 12501 in trunk.
以上是不可能的,因为 SVN(任何主干或分支)中任何地方的任何新提交都将具有修订版 12778 或更高版本。还要注意这是一个revision,在SVN中没有version这样的东西,你不能把“revisions”当成一个“版本”,它是不一样的东西。