分支策略[关闭]

Posted

技术标签:

【中文标题】分支策略[关闭]【英文标题】:Branching Strategies [closed] 【发布时间】:2010-09-07 06:59:40 【问题描述】:

我工作的公司开始对他们当前的分支模型产生问题,我想知道社区已经接触了哪些不同类型的分支策略?

有没有适合不同情况的好方法?贵公司用什么?它们的优缺点是什么??

【问题讨论】:

阅读经典:oreilly.com/catalog/practicalperforce/chapter/ch07.pdf 【参考方案1】:

这是我过去成功使用的方法:

/trunk - 最前沿。代码的下一个主要版本。在任何给定时间可能会或可能不会工作。

/branches/1.0、1.1等代码的稳定维护分支。用于修复错误,稳定新版本。如果是维护分支,它应该编译(如果适用)并在任何给定时间准备好进行质量检查/发货。如果是稳定分支,它应该编译并且功能完整。不应该添加任何新功能,不应该重构,也不应该清理代码。您可以添加前缀来表示稳定分支与维​​护分支。

/branches/cool_feature。用于可能会或可能不会进入主干(或维护分支)的高度实验性或破坏性工作。不保证代码编译、工作或其他行为正常。在合并到主线分支之前应尽可能持续最短时间。

/tags/1.0.1、1.0.2、1.1.3a 等。用于标记打包和发布的版本。永远不会改变。制作任意数量的标签,但它们是不可变的。

【讨论】:

在您的分支/cool_feature 文件夹中,您是分支整个主干还是仅分支某些子文件夹? 通常是整个后备箱。很少有一项功能只涉及一个目录。如果你没有运行 svn 1.5,我也强烈推荐 svnmerge.py。使整个分支/合并过程变得更好。 你展示了一个非常好的模型。我的公司执行的一项政策(我认为这是相当普遍的)是主干应始终构建并通过所有测试。所以你在你的模型下说它“可能有效,也可能无效”。有不同程度的稳定性,我认为执行主干应该始终构建和自动化测试应该始终通过的规则通常是一个很好的规则。 如果您使用分支来“稳定新版本”,那么您如何(持续)构建和(自动)测试它?对我来说,trunk 最重要的是它是每次提交后(持续)构建和(自动)测试的版本。我认为应该在主干中稳定发布,并为未来和过去的版本使用分支,而主干应该用于当前版本。如果可以(持续)构建和(自动)测试所有分支,那么根本不需要主干。我说的对吗?【参考方案2】:

我们的存储库如下所示:

/trunk
/branches
/sandbox
/vendor
/ccnet

/trunk 是您的标准、前沿开发。我们使用 CI,因此必须始终构建并通过测试。

/branches 这是我们进行“批准”的大型更改的地方,即我们知道可以将其放入主干但可能需要一些工作并且会破坏 CI 的地方。还有我们在维护版本上工作的地方,它们有自己的 CI 项目。

/sandbox 每个开发者都有自己的沙箱,外加一个共享沙箱。这适用于您在不进行实际工作时执行的“让我们将 LINQ 提供程序添加到我们的产品”类型的任务。它最终可能会进入主干,也可能不会,但它在那里并且在版本控制之下。这里没有 CI。

/vendor 标准供应商分支,用于我们编译的项目,但它不是我们维护的代码。

/ccnet 这是我们的CI标签,这里只有CI服务器可以写入。后见之明会告诉我们将其重命名为更通用的名称,例如 CI、BUILDS 等。

【讨论】:

【参考方案3】:
    主动开发的一个分支(/main 或 master,取决于行话) 每个维护版本都有一个分支 -> 它只会收到非常小的修复,而所有主要开发都转到 /main 每个新任务都有一个分支:创建一个新分支来处理 Bugzilla/Jira/Rally 上的每个新条目。经常提交,使用 inch pebble checkins 自行记录更改,并仅在完成并经过良好测试后将其合并回其“父”分支。

看看这个http://codicesoftware.blogspot.com/2010/03/branching-strategies.html 以获得更好的解释

【讨论】:

【参考方案4】:

第一件事:KISS(保持简单愚蠢!)

/分支机构 /RB-1.0 (*1) /RB-1.1 (*1) /RB-2.0 (*1) /标签 /REL-1.0(或任何您的版本,例如 1.0.0.123 *2) /REL-1.1 /REL-2.0 /树干 当前开发具有很酷的新功能;-)

*1) 保持版本可维护 - 例如如有必要和/或需要,可以合并到主干的服务包、修补程序、错误修正) *2) major.minor.build.revision

经验法则:

    Tags 文件夹不需要签出 发布分支中只有少量编码(使合并更简单) - 没有代码清理等。 永远不要在标签文件夹中编码 切勿将具体的版本信息放入源文件中。使用占位符或 0.0.0.0,构建机制将替换为您正在构建的版本号 永远不要将第三方库放入源代码管理中(也没有人会将 STL、MFC 等库添加到 SVN ;-)) 仅提交可编译的代码 更喜欢使用环境变量而不是硬编码路径(绝对路径和相对路径)

--hfrmobile

【讨论】:

【参考方案5】:

当一个版本准备好进行最终 QA 时,我们会进行分支。如果在 QA 过程中发现任何问题,则会在分支中修复错误,验证然后合并到主干。一旦分支通过了 QA,我们将其标记为发布。该版本的任何修补程序也会对分支进行、验证、合并到主干,然后标记为单独的版本。

文件夹结构如下所示(1 个 QA 行、2 个修补程序版本和主干):

/分支

/REL-1.0

/标签

/REL-1.0

/REL-1.0.1

/REL-1.0.2

/主干

【讨论】:

【参考方案6】:

我们使用狂野、狂野、西方风格的 git-branch。我们有一些分支具有按惯例定义的众所周知的名称,但在我们的例子中,标签实际上对我们更重要,以满足我们的公司流程政策要求。

我在下面看到您使用 Subversion,所以我认为您可能应该查看Subversion Book 中有关分支的部分。具体来说,请查看Branch Maintenance 和Common Branch Patterns 中的“存储库布局”部分。

【讨论】:

【参考方案7】:

我在这里没有看到的替代方案是“变革分支”哲学。

如果您的后备箱不是“狂野西部”,如果后备箱是“当前版本”怎么办?当一次只发布一个版本的应用程序时,这很有效 - 例如网站。当需要新功能或错误修复时,会创建一个分支来保存该更改。这通常允许将修复程序迁移到单独发布,并防止您的牛仔编码员意外添加您不打算发布的功能。 (通常是后门——“仅用于开发/测试”)

Ben Collins 的建议对于确定哪种风格适合您的情况非常有用。

【讨论】:

我们曾经有这个模型,但是从分支不断合并回来的变化变得非常复杂。现在我们使用树干作为前沿,分支用于稳定和维护。这样就不需要合并树了。【参考方案8】:

Gnat 写了 this excellent break down 关于分支策略的各种建议。

没有一种分支策略,它适用于:

您的团队规模 您的产品和生命周期 您使用的技术(网络、嵌入式、Windows 应用程序) 您的源代码控制,例如Git、TFS、汞

Jeff Atwood 的post 打破了很多可能性。另一个要补充的是促销的概念(来自 Ryan Duffield 的链接)。在此设置中,您有一个 dev 分支、test bracnh 和 release 分支。你提升你的代码,直到它到达发布分支并被部署。

【讨论】:

【参考方案9】:

我们目前有一个用于持续维护的分支,一个用于“新计划”的分支,这意味着“将来某个时候会出现的东西;我们不确定什么时候”。我们偶尔也会进行两个维护分支:一个为当前生产中的内容提供修复,一个仍处于 QA 阶段。

我们看到的主要优势是能够更快速地响应用户请求和紧急情况。我们可以对生产中的分支进行修复并发布它,而无需发布任何可能已经签入的额外内容。

主要缺点是我们最终会在分支之间进行大量合并,这增加了某些内容被遗漏或错误合并的机会。到目前为止,这还不是问题,但一定要牢记这一点。

在我们制定此政策之前,我们通常在主干中进行所有开发,并且仅在发布代码时才进行分支。然后,我们根据需要对该分支进行了修复。它更简单,但没有那么灵活。

【讨论】:

【参考方案10】:

我们在工作中遵循的理念是使后备箱保持在您可以随时推动而不会对站点造成严重损害的状态。这并不是说后备箱将永远处于完美状态。当然,其中会有错误。但关键是永远不要让它彻底坏掉。

如果您有要添加的功能,请分支。设计变更,分支。有很多次我想,“哦,我可以在后备箱里做这件事,不会花那么长时间”,然后 5 小时后,当我无法找出破坏东西的错误时,我真希望我有分支。

当您保持主干清洁时,您就有机会快速应用并推出错误修复。您不必担心您方便地分支的损坏代码。

【讨论】:

【参考方案11】:

对于 Subversion,我同意 Ryan Duffield 的评论。他引用的那一章很好地分析了使用哪种系统。

我问的原因是 Perforce 提供了一种完全不同的方法来从 SVN 或 CVS 创建分支。另外,所有的 DVCS 都给出了它自己的分支哲学。您的分支策略将取决于您使用的工具。

仅供参考,Svnmerge.py 是一个帮助在 SVN 中合并分支的工具。只要您经常(每 10-30 次)提交使用它,它就可以很好地工作,否则该工具会变得混乱。

【讨论】:

【参考方案12】:

无论选择哪种分支模式,您都应该尝试将分支保持为二叉树形式,如下所示:

   trunk - tags
     |
    next
   /  \  \
bugfix  f1  f2
        /   \  \          
       f11    f21 f22
子节点只能与直接父节点合并。 尽量只将整个分支与父分支合并。永远不要合并分支中的子文件夹。 只要您只合并并从整个分支中挑选,您就可以在需要时挑选提交。 上图中的下一个分支只是为了说明,你可能不需要。

【讨论】:

以上是关于分支策略[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

执行具有高分支分歧的任务的最佳策略[关闭]

关闭一个分支是啥意思?

Git从当前分支分支另一个分支[关闭]

如何使现有分支跟踪远程分支[关闭]

如何正确关闭 Mercurial 中的功能分支?

语义版本控制和 git 分支 [关闭]