简单地说,我有以下分支设置:
MAIN
|--- DEV
|--- PROD
大多数开发都在DEV分支中完成。当代码准备好进行测试时,所有内容都会合并到MAIN分支并发布到我们的测试环境中。测试完成后,将完成与PROD的合并,并将所有内容发布到生产服务器。在MAIN或PROD代码中不时发生变化(主要是错误修正),但这是一个例外。
我被要求考虑一个功能和错误修复合并的系统。这意味着应该在MAIN和PROD之间合并DEV中的单独更改。使用我们当前的设置,此信息将丢失:例如功能A,B和C在DEV分支中实现。假设每个特征都有两个相应的变化集:A1,A2,B1,B2,C1,C2。通过我们目前的工作方式,一切都可以一次性合并到MAIN分支。因此,当我们想要“挑选”必须从MAIN到PROD的功能时,我们无法做到这一点,因为MAIN上只有一个变更集:合并的签到。
你会如何解决这个问题?我是否需要根据我的分支策略进行更改?
我正在使用TFS进行源代码管理。
答案 0 :(得分:2)
因此,当我们想要“樱桃挑选”必须从MAIN到PROD的功能时,我们无法做到这一点,因为MAIN上只有一个变更集:签入合并。
如果您愿意,您可以编写一个工具来整理合并历史记录,但真正的答案是不要那样做。当你挑选时,你将失去任何保证,你在源分支中测试和稳定的代码将在目标分支中以相同的方式执行。有时这没关系,但在你的情况下,它会破坏整个目的,即在原始的未经测试的Dev checkins和你的实时PROD部署之间建立一个中间分支。
如my favorite branch/merge video中所述,您的指导原则应该是“合并,复制”。也就是说,每当需要解构和/或应用代码差异时,让不稳定的分支受到攻击。 (樱桃挑选功能是一个其他集成的应用程序就是一个例子。)同时,代码被推广到稳定的分支,如Main& Prod应该始终是一个直接的副本,与你已经工作的东西相匹配,很难稳定在源分支中。听起来你现在正在遵循这个策略;面对樱桃选择保留它将是我使用特征分支的第一动机,甚至比绝缘特征团队更容易破坏。
如Jim所述,管理功能之间的依赖关系是一个问题。如果您可以提前识别它们,通常的解决方案是创建由具有公共依赖项的功能共享的子分支。
Feature1
\
LibA---
/ \
Feature2 \
DEV -- MAIN -- PROD
Feature3 /
\ /
LibB---
/
Feature4
当然,软件并不总是按计划进行。如果需要共享代码的分支位于树的相对侧(例如,如果Feature1依赖于LibA 和 LibB,但Feature2无法成为B的一部分,则这根本不起作用)由于结构或技术原因)。
答案 1 :(得分:1)
我认为这里没有任何魔法酱,你只需要找到一个系统,你可以选择每个单元的主要版本。
这可以通过单独合并每个修订来轻松完成,这很痛苦,但可以得到你想要的。
或者,您可以通过将每个功能一次合并到主要功能中来提高粒度。这要求你按顺序处理功能,如果你是独立的话可能没问题,但是如果你们中的一些人会很痛苦,因为你们必须经历代码冻结,而某些人已经完成了其他人没有。
您可能会或可能不会发现更易于管理的另一种工作方式是为每个功能设置DEV分支。从这个意义上说,不是拥有一个永远存在的DEV分支,而是拥有一系列短暂的DEV分支,这些分支只有在功能完成之前才会存在。
每个DEV分支的重新整合将为您提供主要的明确修订,可以挑选。
您可以在dev分支之间获得依赖关系。假设分支devA需要来自分支devB的一些实现,你必须将devB的必需部分合并到main中,然后将它们合并到devA中。然而,devA不应该需要来自devB的未完成的工作,所以你应该(理论上)能够愉快地对这些部分进行RI。当然,既然你正在挑选PROD,那么这些部分集成就不必发表了。
鉴于你的分支策略,我猜你已经找到了这个,但如果不是,那就值得一读: http://branchingguidance.codeplex.com/wikipage?title=html&referringTitle=Home