我在使用Mercurial时提出了一些建议。
我们目前在中央服务器上使用CVS,并维护一个主分支和几个过去的版本分支。我们的工作流程是在HEAD上实现所有修复/新功能,然后在任何分支上创建版本时,我们将有效地选择我们需要包含在分支上的文件,并移动分支标记以合并这些文件,然后去构建发布(并标记它)。
我想在Mercurial中实现类似的工作流程。但是,我不确定是否可以从默认分支中选择特定的修订(更改集)并将它们应用到我的一个发布分支。我所看到的是人们将修复程序应用到他们的分支,然后将它们拉入默认分支。有没有办法可以使用Mercurial模仿我们的CVS工作流程?
答案 0 :(得分:1)
这在很大程度上取决于您的'过去的版本分支'实际上是什么,但我认为您应该在迁移时采用不同的工作流程。
考虑将合并分支合并为合并河流:合并后的所有内容都在另一个中。这就是为什么如果你想实现一个最终应该在几个分支中的功能,建议的方法是你在其中一个分支中实现它,然后将它合并到其他分支中。理解源分支中的所有将最终出现在目标分支中,而不仅仅是您实现的功能,这一点非常重要。
因此,过去的版本分支形成matryoshka doll是合理的。例如,您有三个长期分支:1.x
,2.x
和default
。 1.x
中的所有功能也出现在2.x
和default
中,2.x
中的所有功能也出现在default
中。 (此处,default
是您下一个主要版本的一个阶段;当您发布v3.0时,您将创建一个新的分支3.x
。)
因此,如果您想在1.x
中制作新功能,请在那里实施,然后进行两次合并:1.x
到2.x
,然后2.x
到{ {1}}(这是前向移植)。如果您尝试在default
(即后端移植)中反过来执行此操作,则无法将default
合并到default
中}或1.x
,因为2.x
还有许多其他内容不应出现在旧版本中。很难违背流程,所以你必须将必要的更改移回default
和1.x
,这很可能不会干净利落,你基本上都是手工做的Mercurial可以为您做的事情。
您可以查看Python存储库的布局,在dev guide中解释。
答案 1 :(得分:1)
根据我的经验,以及我对集体分布式版本控制用户体验的理解,问题在于,挑选变更集是(实际上一直是)合并冲突的一个方法。从本质上讲,通过尝试对最新代码进行更改并将它们“反向”到旧代码,您迫使自己不得不一遍又一遍地重做相同的合并。
想象一下,你正在维持三个版本Head,Head-1和Head-2。在Head-1中,您实施了一项重大的重构更改。现在,您要在Head中实现三个要包含在Head-1和Head-2中的新功能。由于Head和Head-1都具有相同的大型重构,因此将新功能合并到Head-1中并不会那么复杂。但是,要合并Head-2中的新功能,您可能必须在所有三个功能中解决完全相同的合并冲突,以绕过主要的重构。
事实是,你可能已经这样做了 - 你只是没有意识到它,因为CVS也没有帮助你在另一个方向进行合并。像Mercurial和Git这样的新版本控制系统可以使“前进”方向合并得更加容易。
因此,不要在Mercurial中实现Head中的三个功能,而是在Head-2中实现更改。由于合并信息已经在图模型中捕获,因此很可能将合并到Head-1然后将Head合并到一起。
我并不是说你要求的东西无法完成 - 你可以使用像移植扩展这样的东西来实现你的模型 - 你只是不会利用Mercurial的优秀合并能力你这样做,你会为自己和你的团队做更多的工作。