我们使用Subversion,除了像我这样的少数人之外,在Subversion中几乎没有分支和合并的经验。我的Subversion经验仅限于简单的功能分支,其中合并和树冲突虽然并不十分罕见,但并不是很难解决。
鉴于此,我正在帮助管理一个项目,我们当前对trunk方法的提交根本不可持续地满足我们的需求。我介绍了功能分支和合并到我的本地化团队,我们取得了一些成功。然而,简单的功能分支仍然无法回答我们的所有问题,例如:
似乎git-flow as defined here可以解决很多这些问题。我在Mercurial中尝试了这个方法,似乎也可以在那里实现这个方法。遗憾的是,此时迁移到DVCS已不在考虑范围内。
但是,我在Subversion中模仿此方法的简短尝试失败了许多合并和树冲突。合并选项和边缘情况很多,令人费解。
可以使用Subversion来实现git-flow,如果是,那么疼痛程度是多少?
答案 0 :(得分:30)
我们使用所谓的 unstable 主干开发方法。这是Subversion的创建者在创建Subversion时想到的开发方法。它简单易行。
以下是一个如何运作的想法:
会有一些合并。它主要是将发布分支上固定的缺陷合并到主干上。这样做有三种选择:
--record-only
标志合并)。当然,您意识到此方法采用了名为规划的方法。您必须优先考虑您的工作,以便开发人员在为将来的版本工作之前完成即将发布的版本的工作。只有在即将发布的版本中没有足够的工作才能让所有开发人员忙碌时,才会进行分支。
您可以实现标准Git工作流,该工作流为每个开发人员或问题使用开发单独的开发分支,然后将这些更改传递到主干上。这需要很多分支,每个开发人员/功能一个分支。
首先从主干到分支合并到 rebase 您的代码。完成rebase后,使用--reintegrate
开关将分支合并回主干。 1.6之前的版本,您可能会删除分支并重新创建它,因为--reintegrate
混乱的混合跟踪。但是,已在版本1.6.x及更高版本中修复此问题。
答案 1 :(得分:2)
这是个大问题。我只有想法如何解决一些问题:
trunk
- 我认为它是master
分支。development
分支是下一个版本的代码使用git svn
可以至少部分地解决其中一些问题。通过使用它,您可以使用gits分支功能进行本地实验,而无需将其存储在全局存储库中。当然,如果你正在探索团队中许多成员的新功能,这并不是很有趣,除非他们都习惯使用git并通过网络互相拉扯。
通过使用git svn
,您还可以使用git cherrypick
手动选择从一个分支到另一个分支的单个提交(例如,开发到release-x.x-tag)。
这就是我现在想出来的所有内容,希望它有所帮助。
答案 2 :(得分:1)
在我的活动中,我使用SVN采用以下方法。
Trunk是“主”分支。你不应该直接在trunk中提交任何东西。 Trunk始终需要与生产中最新发布的版本完全匹配。 因此,trunk始终代表一个稳定的分支。 只有重新整合分支才会更新中继。
您的工作需要分支机构。每个新分支都必须从主干创建,因此每个新分支在创建时都与生产版本完全匹配。 更改和修复将在分支机构中提交。
您应至少拥有2个主要分支:
为每个主要工作流创建一个分支:项目,子项目,变更请求。您可以使用并行开发。
创建“集成”分支以加入您必须发布的分支。您需要合并到集成分支中,每个分支都要参与发布。 因此,集成分支可以加入修补程序和项目,例如。
从集成分支或分支自我构建工件。
当您发布分支时,请为该版本创建标记,以便您可以获得已发布版本的副本,并且仍然可以使用该分支。 在标签中,您应该只发布版本。不要在标签中提交更改!
分支发布后,您需要更新主干。因此,重新整合树干中的分支。您可以直接重新集成集成分支或分支(如果您没有从集成中传递)。
当主干再次与生产版本匹配时,请在所有活动分支中报告。
这种方法实际上并不是git-flow概念的复制品,但它遵循了一些要求。
通过这种方法,您可以获得以下优势:
行李箱稳定。你总是知道当时干线代表什么。
每个分支只包含自己的更改。
使用集成分支,您可以在单个版本中管理并行分支
使用代码,您始终拥有已发布版本的副本
缺点是:
要管理的许多分支机构。
您需要经常合并和切换,特别是将更改报告给集成分支
每次都要解决许多冲突
顺便说一句,这是我曾经使用过的最佳方法,因为它可以让你控制版本。