考虑一个简单的源代码控制布局,其中trunk代表开发中的未来版本,代表当前正在生产的版本的单个分支。
当发现需要在两个分支中修复的错误时,是否应首先对主干进行更改然后合并到分支,或首先进入分支,然后合并到主干?通常情况下,我首先在主干中进行了修复,然后向下合并,但是这种方式的风险增加,以至于未来的新功能会意外地合并。什么在你的经历中效果最好?
答案 0 :(得分:2)
如果错误修复是自己的签入(这通常是你想要做的),那么合并新功能和错误修复的风险应该相对较小 - 只需选择单一签入作为修订版本合并。
我发现合并来自主干的分支的错误修正的风险更大,即你可以忘记进行合并。目前,一切看起来都很好 - 您从分支机构构建的发布版本具有修复功能。只有很久以后你会发现因为你忘了合并,这个bug仍然在主干中。
出于这个原因,我宁愿修复主干,然后合并到分支。
答案 1 :(得分:2)
我总是首先执行修复trunk中的错误的策略,然后将其合并到发布分支。
我之所以选择这个,是因为在进入发布分支之前,需要对需要发布的任何更改进行审核,测试和验证。发布分支是代码的 pristine 副本,因此只有经过审核,测试和验证的更改才能进入。
答案 2 :(得分:2)
在记录完整合并历史记录的系统中(例如基于DAG的系统,如Git,Mercurial等),在最古老的地方分支的分支上开发功能和修复可能是最有意义的。将需要特定的变化。 这样可以更轻松地将已完成的分支合并到所有目标分支中。
刚开始只有development
。
--o--o--o development
最终,您决定准备好使用内容。您创建production
分支。工作继续development
,但该工作尚不适合production
(这意味着您不应尝试将development
合并到production
)。
--o--o--o--o production
\
o--o--o development
发现了一个错误,需要在两个分支中修复它。 错误修复更改的分支应该从需要修复的所有分支的共同祖先分叉。
--o--o--o--o production
|\
| \------o--o bugfix-1
\
o--o--o development
修复完成后,它会合并到production
和development
中。这是可能的,因为bugfix-1
是从两个分支的共同祖先分叉的。
--o--o--o--o----------o production
|\ /
| \------o--o bugfix-1
\ \
o--o--o-----o development
除了使用共同的祖先,您甚至可能从引入该错误的提交中分离错误修复分支。这将确保错误修复可以合并到任何可能的分支中,该分支本身包含有缺陷的提交(因为在完全分布式系统中,您可能不知道所有使用有缺陷提交的分支)。
A successful Git branching model的“修补程序”分支是此类工作流程的变体。 Git的维护者有一篇关于the purposes of branches的博客文章,它可能也有助于澄清如何/为什么要创建分支,以及当他们的内容可能在多个后代分支中使用时如何有效地使用它们(例如,为什么你可能想要避免合并'上游'分支到特征分支)。
如果你以相反的方式工作(从只在你的一个目标分支上的提交中分配错误修复分支),你将最终不得不“重放”(即“樱桃挑选”或“反驳”)从错误修复分支到其他目标分支的个别更改,而不是正常合并。这种方法可行,但这意味着您必须跟踪错误修复分支的所有化身,以验证特定目标分支是否包含错误修复的(版本)(或者回退到手动代码检查)。 / p>
在“development
之上修复错误。
--o--o--o--o production
\
o--o--o development
\
b--b bugfix-1
将其合并到development
(示例显示Git中所谓的'非快进'合并),并将错误修复提交(b
)转移到{ {1}}(production
),因为将b'
合并到development
会是一个坏主意 - 并非所有内容都可以投放生产:
production
--o--o--o--o--b'--b' production
\
o--o--o------o development
\ /
b--b bugfix-1
提交与b
分支中的b'
提交之间没有记录关系。这种缺乏关系意味着,如果您希望能够回答“是否某些分支,W,是否有错误修复?”的问题,则必须询问production
和b
提交。一种自动化的方式。
答案 3 :(得分:1)
两种选择都很有效。这实际上取决于每个案例最有意义的地方。
您的痛苦情景还可能包括在一个分支中修复错误并将其合并到其他几个分支。
旧的源代码管理工具中更大的问题是记住哪些'补丁'应用于哪里。
许多较新的scm包实现了与GUID或其他唯一标识符的合并,以简化合并跟踪。
在他们引入合并跟踪之前的subversion中,它有助于为合并提出标准化的签入格式,以确保您可以轻松地跨分支跟踪合并。