Git中/ Subversion的功能向后移植(Feature backporting in Git

2019-07-31 04:22发布

什么是实现用下面的工作流的首选方法GitSubversion (我有更多的兴趣Git版本,但比较肯定将是有益的):

  • 比方说,我们最近有产品的主要版本,并有一个叫特定polisihin分支release-2.0.x

    发展再持续几个特性分支合并到master/trunk (他们以后将成为即将到来的部分release-2.1.x )。

  • 现在,在某些时候另一个特征(即critical-feature )的开发和重新合并到master/trunk 。 我们认识到,这个功能是非常重要的,我们要反向移植它release-2.0.x


这里是一个小pseudographic插图所描述的情况。 需要注意的是在顶部之间的一切分歧树带来release-2.0.x和当前的master/trunk 导致合并问题 (否则我可以简单地合并critical-feature ,避免写这个问题:)

    (features added since 2.0.x, which
     should not be backported)
              ^   ^    ^
              |   |    |    (code refactorings done
              |   |    |     in master/trunk)
              \   |    /     (*) (*) (*)          
-------------------------------------------------------> master/trunk
      |                                          |
      |                                          |
      |                                          |
      \ release-2.0.x                            \ critical-feature
                                                   (should be backported)

问题:

  • 什么是执行功能从向后移植的最佳途径VCS观点?

  • 这应该做一个简单的merge相应的critical-feature与冲突解决冲突的分支?

  • 或者应该这样做的cherry-pick的提交,它融合了critical-featuremaster/trunk当它这样做? 或者甚至为一组的cherry-picks每个提交的critical-feature分支?

  • 你可以建议一些对冲突解决过程? 你应该做一个,如果之间的电流差release-2.0.xmaster/trunk是如此巨大,是“天真”向后移植导致了巨大的冲突量因代码重构和缺少功能或API ,这是后加release-2.0.x

  • 请问GitSubversion有一些具体的事情来提供该程序,除了标准的合并或挑肥拣瘦的做法? 我想, 再过当量将不会在情况下有益的,当冲突的量是巨大的,但是,很明显,我可能是错的。

Answer 1:

的向后移植功能所需的全部想法看起来打破了我。 只有关键和非破坏性的变化应该回迁。 对于功能和改进,你必须创建新的分支,并开始稳定期。

在Apache的Subversion项目所使用退房释放的过程: https://subversion.apache.org/docs/community-guide/releasing.html#release-stabilization



Answer 2:

这取决于。 如果关键的功能相对简单,小,你可以只让几个樱桃选秀权。 但是,当然,这可能会导致很多的合并冲突的,因为该功能的实现可以使用重构的代码。 不过,据我所知这将是最简单的解决方案。 只为SVN的解决方案。

然而,这种解决方案并不反映在历史图表的行动,它混淆了。

使用Git还有另一种选择,以重订的关键特征在merge-base船长和的release-2.0.x分支。 它的字面意思,你应该使用旧代码,这是两个分支共同重新实现的功能。 在这种情况下,你可以再合并重订基期的特征。 如果你已经合并了该功能的主控不已,当你将合并衍合功能入主,它极有可能会发生冲突(becasue主已经有了这样的实现)。 所以,你会化解矛盾,然而在大多数情况下,这将是很容易的,因为变化应该是几乎一样的。

有关重订基期的特征方法的好处是,如果你会在里面发现了错误,你可以在特性分支修复它,轻松地合并到修复释放和主分支。

当然,重订基期可能会导致很多冲突,但它意味着没有简单的方法来反向移植功能到release-2.0.x 。 也许它会更容易只是重新实现它呢。



Answer 3:

我已经开发了一些工具,专门用于使这个过程更容易使用Git,而上周我写了一个广泛的博客文章他们。 尤其是, git cherry-menu在该职位中引用命令可以接受提交到反向移植,因此使用的任意列表git log和你喜欢的文本编辑器,你可以建立一个合理的精心挑选构成关键特征是提交的名单回迁,然后运行是这样的:

git checkout -b release-2.0.y release-2.0.x
git cherry-menu cat commits-to-backport.txt

这与菅直人的基础重建的建议,只是向后移植过程更加结构化,并通过使用引擎盖下的git的笔记,你会得到一些便利额外的功能,包括所有的元数据描述的过程多次运行的持续git cherry-menu

当然,如果你只需要提交到反向移植了一把,菅直人是正确的,你还不如干脆直接摘樱桃。

不幸的是,我认为接受的答案稍有是自相矛盾的:

的向后移植功能所需的全部想法看起来打破了我。 只有关键和非破坏性的变化应该回迁。 对于功能和改进,你必须创建新的分支,并开始稳定期。

因为创建一个新的分支,并开始稳定期还是向后移植。 唯一的区别是你决定把回迁提交到哪个分支! 您可以把它们放到原来的release-2.0.x分支,或不同的分支叉掉它,就像release-2.0.y分支我上面建议。 这是一般安全/清洁剂做后者(我想这是伊万的点),但实际上这取决于你如何组织你的仓库和分支机构。 它仍然无法避免进行摘樱桃和潜在的冲突的解决,虽然需要。



文章来源: Feature backporting in Git / Subversion