【发布时间】:2010-09-14 00:23:28
【问题描述】:
我有一些提交,我已经决定,事实上,将是更多的分支工作而不是主干工作。如何创建分支并恢复主干,同时仍确保以后合并不痛苦?
是不是像把当前主干复制到一个分支然后还原主干一样简单?还是以后会让人头疼?
【问题讨论】:
我有一些提交,我已经决定,事实上,将是更多的分支工作而不是主干工作。如何创建分支并恢复主干,同时仍确保以后合并不痛苦?
是不是像把当前主干复制到一个分支然后还原主干一样简单?还是以后会让人头疼?
【问题讨论】:
我认为 Philips 的方法类似于以下,假设最后一个“好”版本是 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 merge -r 100:130 svn://repos/trunk svn://repos/branches/newbranch)基本上删除您希望从 newbranch 进行的更改 (100:130)。
说实话,我复制我的更改,恢复主干、分支,然后将我的更改提交到分支。主要原因是以后易于合并(如果您稍后在分支点从主干合并到分支,合并将包含您初始更改的还原)。
这可能不是“正确”的方式,因为您在合并时总是可以跳过修订,但以后对我来说通常不会那么头疼。免责声明:我不是 svn 大师,所以对我来说可能更容易,因为我做错了 - 但我确实经常使用 svn。
【讨论】:
遵循 Philip 的方法并没有错,只是它在修订历史中留下了一些“粗糙”。如果您想为了整洁而删除它们,并且修订版位于 HEAD,您可以按照 these instructions 将它们从存储库中删除。
更新: Philip 的方法比问题中建议的方法更好,原因是他说的。 Mine 和 Philip 的方法类似,除了恢复主干我建议从修订历史中删除修订。 (正如我所说,只有当您要删除的所有修订都位于存储库的 HEAD 时,才能这样做。)
【讨论】:
我这里没有可用的 svn,但我会尝试这样做:
确定您在历史上开始犯下坏事的时间点(比如修订版“100”,而您处于“130”时)
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,它将跟踪合并点并避免虚假冲突)
【讨论】: