我有一些我已经决定的提交,事后,将是更多的分支工作而不是主干工作。如何创建分支并恢复主干,同时仍确保以后合并不痛苦?
是否像将当前主干复制到分支并还原主干一样简单?或者这会在以后引起头痛吗?
我认为飞利浦方法类似于以下,假设最后一个“好”版本是 100,而您现在是 130,以创建新分支:
svn copy -r100 svn://repos/trunk svn://repos/branches/newbranch
svn merge -r 100:130 svn://repos/trunk svn://repos/branches/newbranch
请注意,这个想法是保留在这些修订中所做的更改,以便您可以将它们应用回主干。
恢复主干:
svn merge -r130:100 .
svn ci -m 'reverting to r100 (undoing changes in r100-130)' .
(执行这些操作的顺序无关紧要,因此您可以在创建分支之前恢复主干。)
然后你可以切换到你在 repo 中创建的新分支:
svn switch svn://repos/branches/newbranch workdir
老实说,我复制我的更改,恢复主干、分支,然后将我的更改提交到分支。主要原因是以后易于合并(如果您稍后在分支点从主干合并到分支,合并将包含您初始更改的恢复)。
这可能不是“正确”的方式,因为您在合并时总是可以跳过修订,但以后对我来说通常不会那么头疼。免责声明:我不是 svn 大师,所以对我来说可能更容易,因为我做错了 - 但我确实经常使用 svn。
遵循菲利普的方法并没有错,除了它在修订历史中留下了一些“粗糙”。如果您想为了整洁而删除它们,并且修订版位于 HEAD,您可以按照这些说明将它们从存储库中删除。
更新:由于他所说的原因,菲利普的方法比问题中建议的方法要好。Mine 和 Philip 的方法将是相似的,除了我建议从修订历史中删除修订之外的恢复主干。(正如我所说,只有当您要删除的所有修订都位于存储库的 HEAD 时,才能这样做。)
我这里没有可用的 svn,但我会尝试这样做:
确定你开始犯下坏事的历史点(比如你在“130”时的修订“100”)
svn copy trunk branch # create your branch while preserving history
svn copy trunk@100 trunk #replace current revision with revision 100
这应该绕过不良历史记录而不添加反向合并(实际上您正在绕过 100 到 130 之间的主干历史记录,但您在分支中保留了指向该历史记录的链接并访问主干,同时强制 rev 仍然会产生正确的历史记录)
然后
svn switch branch workdir
如果您想从主干中完全删除更改,这应该可以工作。如果你想保留一些小的,你可以从分支到主干再次挑选它们(如果你使用 svn 1.5,它将跟踪合并点并避免虚假冲突)