我最近加入了一个代码库,该代码库尚未受版本控制。代码已经由组织中的不同人员多次分叉,从事不同的项目。现在我们将开始使用版本控制,我们希望合并来自不同项目的宝贵贡献。这些项目共享一个共同的原始版本,因此我为每个项目创建了一个分支,并计划开始合并。 现在我想知道在合并时使用什么策略。
您如何选择分支开始合并?变化最小的那个?那个最可怕的人?在将其中一个项目合并到主干后,您是否会将所有分支与主干同步?在与许多分歧很多的分支机构合作时,是否有最好的做法?
或者我应该不再担心并开始逐一合并它们?
答案 0 :(得分:1)
我猜每个子项目都有很多副本/ zip文件,但是不同的“分支”存在于不同的文件夹/计算机中,或者可以通过其他方式区分。
然后你有两个选择:重建整个项目历史,或者使用当前版本作为不同的合并基础。
只有在您以后需要完整历史记录时才会这样,因为这是很多工作。
第一个问题是确定哪些版本相互复制。您可以使用文件时间戳来获得粗略的历史估计(查找每个副本中的最新文件)。在你有一个时间线之后,你可以将它们导入到VCS中并查看是否有反转补丁(rev4中包含的内容,在rev5中排除并再次包含在rev6中),这表明订单不是正确。还要看看这些变化是否有意义(更改会创建更多功能和更少的错误)。在准备好之前,请准备好多次执行此步骤。因此,不要使用最终的VCS,因为您可能希望抛弃中间步骤。 我还建议在本地计算机上安装存储库,因为你需要在多个版本之间做很多差异,并且不需要任何网络延迟(我使用mercurial和tortoiseHg进行此类任务)。
在此过程结束时,您应按时间顺序排列所有副本,并且(至少粗略地)知道不同分支所基于的位置。
所以当你有这样的事情时:
Base --> A --> A'
\
\---> B --> B'
\
\--> C
您可以先使用Base创建主干,然后在其中添加更改A和A'。然后创建分支B,其中A为父级,并添加B'。然后用B作为父级创建分支C.对于你拥有的每一份副本都是如此。
拥有重建历史后,您可以开始大合并。但除非你能在重建过程中重建内部合并,否则当你将所有内容整合在一起时,使用这种方式将没有任何优势。
将基本版本导入VCS。然后为每个其他版本创建一个分支,并将每个其他版本放入相应的分支。之后你可以合并一切。
答案 1 :(得分:1)
如果您希望顺利合并,则应确保在版本控制系统中包含每个合并的基本版本(如果有)。只要确定人们最多分支的一个分支是一个主干,然后你需要在每次有人分支的时候在主干上记录一个版本,如果你有这些分支。没有这些基础版本,合并将变得一团糟。
如果没有版本控制,甚至没有人在他们合并时执行代码的tarball,所以你无法重建甚至与基本版本一样少,你需要非常小心。在合并任何内容之前将代码放入源代码控制中。尝试通过从哪里分支的方式尽可能近似地重建分支。
现在,如果您的源代码控制系统记录分支之间的合并链接并保持良好的基本版本和合并跟踪,例如ClearCase,您希望从较小的合并开始,这可以由各个开发人员完成以减少工作先并行。然后与所有涉及的开发人员进行大型合并。
另一方面,如果您没有良好的跟踪,则在后续合并中将再次弹出已完成合并的更改,您可能需要再次重新更新冲突。这非常痛苦所以我建议与整个团队进行大规模合并,这样每个人都可以看到已经决定的内容,然后他们可以在较小的合并期间保留正确的代码。
主要的一点是,如果没有适当的合并跟踪,您需要了解代码存在或进行合并的人,因为他需要识别正确的(当前)代码块以进入文件。 / p>
答案 2 :(得分:0)
在开始合并之前,我应该考虑使用哪种版本控制工具(你没有提到你正在使用的是什么)。绝对避免使用VSS,CVS和Perforce。 Subversion和Perforce都可以,但是如果你创建了许多分支,那么你会发现有一个管理开销来保持它的全部工作。 GIT,Accurev和PureCM是我用于合并的最佳工具。如果您喜欢分布式模型,请使用GIT,否则我会选择非常便宜的PureCM。
您应该根据公共代码为您的主干创建分支。从这里你可以从主干一个接一个地创建其他分支。为项目分支创建工作区,使用项目文件破坏工作区文件并将其签入。然后,您可以将此更改合并回主干并解决任何冲突。
答案 3 :(得分:0)
合并这些不同代码库的一种可能方法是在SVN中使用名为vendor branches的东西。
示例:
A - 最古老的代码分支 B - 第二个最古老的代码分支 C - 等等
导入A. 供应商导入B,修复 供应商导入C,修复 等