Version control 选择合并方向

Version control 选择合并方向,version-control,merge,branch,Version Control,Merge,Branch,考虑一个简单的源代码管理布局,主干表示开发中的未来版本,单个分支表示当前生产中的版本 当发现需要在两个分支中修复的bug时,应该先对主干进行更改,然后合并到分支,还是先对分支进行更改,然后合并到主干?通常情况下,我会先在主干中进行修复,然后向下合并,但这样一来,将来的新功能意外合并的风险会增加。在您的经验中,什么最有效?这两个选项都非常有效。这真的取决于它在每种情况下最有意义的地方 您的痛苦场景还可能包括修复一个分支中的bug,并将其合并到其他几个分支 --o--o--o--o--------

考虑一个简单的源代码管理布局,主干表示开发中的未来版本,单个分支表示当前生产中的版本


当发现需要在两个分支中修复的bug时,应该先对主干进行更改,然后合并到分支,还是先对分支进行更改,然后合并到主干?通常情况下,我会先在主干中进行修复,然后向下合并,但这样一来,将来的新功能意外合并的风险会增加。在您的经验中,什么最有效?

这两个选项都非常有效。这真的取决于它在每种情况下最有意义的地方

您的痛苦场景还可能包括修复一个分支中的bug,并将其合并到其他几个分支

 --o--o--o--o----------o    production
         |\           /
         | \------o--o      bugfix-1
          \           \ 
           o--o--o-----o    development
在旧的源代码管理工具中,更大的问题是记住在哪里应用了哪些“补丁”

许多较新的scm软件包使用GUID或其他唯一标识符实现合并,以使合并跟踪更容易


在subversion中,在引入合并跟踪之前,为合并提供标准化的签入格式是有意义的,以确保您可以轻松地跨分支跟踪合并。

这两个选项都非常有效。这真的取决于它在每种情况下最有意义的地方

 --o--o--o--o----------o    production
         |\           /
         | \------o--o      bugfix-1
          \           \ 
           o--o--o-----o    development
您的痛苦场景还可能包括修复一个分支中的bug,并将其合并到其他几个分支

 --o--o--o--o----------o    production
         |\           /
         | \------o--o      bugfix-1
          \           \ 
           o--o--o-----o    development
在旧的源代码管理工具中,更大的问题是记住在哪里应用了哪些“补丁”

许多较新的scm软件包使用GUID或其他唯一标识符实现合并,以使合并跟踪更容易


在subversion中,在引入合并跟踪之前,为合并提供一种标准化的签入格式是有意义的,以确保您可以轻松地跨分支跟踪合并。

如果修复程序是在自己的签入中,这通常是您想要做的,然后,合并新特性和错误修复的风险应该相对较小——只需选择单个签入作为合并修订

 --o--o--o--o----------o    production
         |\           /
         | \------o--o      bugfix-1
          \           \ 
           o--o--o-----o    development
我认为从主干合并来自分支的错误修复存在更大的风险,即您可能会忘记进行合并。目前,一切看起来都很好——您正在从分支构建的发布版本已经修复。直到很久以后,您才会发现bug仍然在主干中,因为您忘记了合并


出于这个原因,我更愿意在主干中进行修复,然后合并到分支。

如果修复程序本身正在签入(这通常是您想要做的),那么将新功能与修复程序合并的风险应该相对较小-只需选择单个签入作为要合并的修订

我认为从主干合并来自分支的错误修复存在更大的风险,即您可能会忘记进行合并。目前,一切看起来都很好——您正在从分支构建的发布版本已经修复。直到很久以后,您才会发现bug仍然在主干中,因为您忘记了合并


出于这个原因,我更愿意先修复主干中的bug,然后合并到分支。

我总是强制执行一项策略,首先修复主干中的bug,然后将其合并到发布分支


我选择这样做是因为任何必须发布的更改都需要在进入发布分支之前进行审查、测试和验证。发布分支是代码的原始副本,因此只有经过审查、测试和验证的更改才能进入该分支。

我始终强制执行先修复主干中的错误,然后将其合并到发布分支的策略


我选择这样做是因为任何必须发布的更改都需要在进入发布分支之前进行审查、测试和验证。发布分支是代码的原始副本,因此只有经过审查、测试和验证的更改才能进入它。

在记录完整合并历史的系统中,例如基于Git、Mercurial和其他系统,在分支上开发特性和修复可能最有意义,这些分支是从最古老的地方派生出来的,需要进行特定的更改。 这样可以更容易地将完成的分支合并到所有目标分支中

 --o--o--o--o----------o    production
         |\           /
         | \------o--o      bugfix-1
          \           \ 
           o--o--o-----o    development
你从发展开始

最终,您决定内容已准备好使用。你做生产部门。开发工作仍在继续,但该工作还不适合生产,这意味着您不应该尝试将开发合并到生产中

发现一个bug,需要在两个分支中修复它。 错误修复更改的分支应该从需要修复的所有分支的共同祖先派生

 --o--o--o--o             production
         |\
         | \------o--o    bugfix-1
          \
           o--o--o        development
一旦修复就绪,它将合并到生产和开发中。这是可能的,因为bugfix-1是从两个分支的共同祖先派生出来的

 --o--o--o--o----------o    production
         |\           /
         | \------o--o      bugfix-1
          \           \ 
           o--o--o-----o    development
而不仅仅是使用共同的祖先, 您甚至可以从引入错误的提交中派生错误修复分支。这将确保bug修复可以合并到任何可能的分支中,该分支本身包含有缺陷的提交,因为在完全分布式的系统中,您可能不知道所有使用有缺陷的提交的分支

来自的“修补程序”分支是此类工作流的变体。Git的维护人员发表了一篇博客文章,这也可能有助于澄清应该如何/为什么创建分支,以及当分支的内容可能用于多个子分支时如何有效地使用它们,例如,为什么您可能希望避免将“上游”分支合并到功能分支中

如果您以另一种方式从仅在一个目标分支上的提交中派生出bug修复分支,那么您将不得不“重播”,即从bug修复分支到其他目标分支的“cherry pick”或“rebase”单个更改,而不是执行正常的合并。这种方法会起作用,但这意味着您必须跟踪bug fix分支的所有化身,以验证特定的目标分支是否包含bug fix版本,或者依赖于手动代码检查

使bug修复“在”开发之上

“将其合并到开发”示例显示了Git中所谓的“非快进”合并,并且rebase/cherry pick错误修复将b提交到生产b“因为将开发合并到生产中是个坏主意,但并非所有内容都已准备好生产:

 --o--o--o--o--b'--b'      production
          \
           o--o--o------o  development
                  \    /
                   b--b    bugfix-1

生产分支中的b提交和b提交之间没有记录的关系。这种关系的缺失意味着,如果您想以自动化的方式回答“某个分支W是否修复了错误?”的问题,您必须同时询问b和b'提交。

在记录完整合并历史的系统中,例如基于Git、Mercurial等系统,在分支上开发特性和修复可能最有意义,这些分支是从最古老的地方派生出来的,需要进行特定的更改。 这样可以更容易地将完成的分支合并到所有目标分支中

 --o--o--o--o----------o    production
         |\           /
         | \------o--o      bugfix-1
          \           \ 
           o--o--o-----o    development
你从发展开始

最终,您决定内容已准备好使用。你做生产部门。开发工作仍在继续,但该工作还不适合生产,这意味着您不应该尝试将开发合并到生产中

发现一个bug,需要在两个分支中修复它。 错误修复更改的分支应该从需要修复的所有分支的共同祖先派生

 --o--o--o--o             production
         |\
         | \------o--o    bugfix-1
          \
           o--o--o        development
一旦修复就绪,它将合并到生产和开发中。这是可能的,因为bugfix-1是从两个分支的共同祖先派生出来的

 --o--o--o--o----------o    production
         |\           /
         | \------o--o      bugfix-1
          \           \ 
           o--o--o-----o    development
您甚至可以从引入错误的提交中派生错误修复分支,而不仅仅是使用公共祖先。这将确保bug修复可以合并到任何可能的分支中,该分支本身包含有缺陷的提交,因为在完全分布式的系统中,您可能不知道所有使用有缺陷的提交的分支

来自的“修补程序”分支是此类工作流的变体。Git的维护人员发表了一篇博客文章,这也可能有助于澄清应该如何/为什么创建分支,以及当分支的内容可能用于多个子分支时如何有效地使用它们,例如,为什么您可能希望避免将“上游”分支合并到功能分支中

如果您以另一种方式从仅在一个目标分支上的提交中派生出bug修复分支,那么您将不得不“重播”,即从bug修复分支到其他目标分支的“cherry pick”或“rebase”单个更改,而不是执行正常的合并。这种方法会起作用,但这意味着您必须跟踪bug fix分支的所有化身,以验证特定的目标分支是否包含bug fix版本,或者依赖于手动代码检查

使bug修复“在”开发之上

“将其合并到开发”示例显示了Git中所谓的“非快进”合并,并且rebase/cherry pick错误修复将b提交到生产b“因为将开发合并到生产中是个坏主意,但并非所有内容都已准备好生产:

 --o--o--o--o--b'--b'      production
          \
           o--o--o------o  development
                  \    /
                   b--b    bugfix-1
生产分支中的b提交和b提交之间没有记录的关系。这种关系的缺失意味着,如果您希望能够以自动化的方式回答“某个分支W是否修复了错误?”的问题,您必须同时询问b和b'提交