将Git Feature分支合并到" Beta"分支(在它已经合并到"开发"分支后)

时间:2016-11-14 17:20:50

标签: git github merge

我们有一个标准的Web项目,并为该项目维护3个核心分支:Master,Beta和Develop。以下是我们使用的流程/工作流程的摘要:

(1)请求新功能/更新,因此我们创建了一个新功能分支。

(2)对新功能分支进行提交,并将功能分支合并到“开发”功能中。科; '发展'然后将分支发布到要测试的测试环境中。

(3)测试/批准新功能后,在同一功能分支中进行新的拉取请求;这个新的拉取请求旨在合并到“测试版”中。科。

' Beta'分公司拥有我们所有的"准备就绪"功能:事实上,我们发布了' Beta'直接分支到生产环境,当它准备就绪时,我们立即合并' Beta'分支到主人'分支....通过这样做,'大师' branch始终是生产环境中代码的副本。

问题:在上面的步骤3中,当我们尝试将新功能分支合并到“测试版”中时。分支,pull请求包括已合并到' Develop'科。

示例:5个功能分支分别合并到“开发”中。分支(分支标记为1,2,3,4和5)。所有5个都经过测试,但是前4个有bug。所以分支" 5"已批准,我们尝试为该功能分支创建一个拉取请求并将其合并到“测试版”....但是当我们这样做时,拉取请求包括所有5个功能分支....不仅仅是分支的提交" 5"。

我们必须做错事!我们可以做些什么来修复我们的流程/工作流程?

6 个答案:

答案 0 :(得分:6)

  

(3)测试/批准新功能后,在同一功能分支中进行新的拉取请求;这个新的拉取请求旨在合并到“测试版”中。分支。

     

' Beta'分公司拥有我们所有的"准备就绪"功能:事实上,我们发布了' Beta'直接分支到生产环境,当它准备就绪时,我们立即合并' Beta'分支到主人'分支....通过这样做,'大师' branch始终是生产环境中代码的副本。

     

问题:在上面的步骤3中,当我们尝试将新功能分支合并到“测试版”中时。分支,pull请求包括已合并到' Develop'分支。

不,这没有意义。如果发生这种情况,您就省略了重要信息,例如:

  • 每个新功能分支都从另一个分支分支出来。哪一个,发展?然后很明显,无论开发提交是否在新创建的功能的历史中,也将合并到beta分支中。 Git历史是一个有向无环图,每个提交指向一个(正常提交)或多个(合并提交)父提交。
  • 为了使功能完全合并到开发中,可能会定期将功能分支重新定位到开发中,或者可能通过合并最新的开发来更新功能分支,这两者都很有意义,我提倡它。但在这种情况下,他们的历史也包含了合并/变基时的所有发展历史。

在每种情况下,您的工作流程都会从根本上被打破,无法就您对Beta分支的想法发挥作用。因此,如果你想避免挑选(糟糕!糟糕!糟糕!)你怎么能实现你想做的事情?有一些基本选项:

  1. 功能切换:丑陋。我会尽可能远离它。在任何分支中停用功能的最佳方法是首先在该分支上没有相应的提交。
  2. 干净利落地工作:好。避免合并未经测试/未接受的功能以进行开发。只有在完成时(如在"完成"的定义中)合并它们并由客户接受。确保您设置了一个环境,使您的客户可以直接在功能分支上进行测试,而不是将其全部压缩到测试版分支上。这样开发的任何内容都固有地为生产做好准备,您不再需要beta分支。未完成的工作永远不会被合并到更高级别的分支。这就是GitFlow的全部内容,它的工作原理。即使你没有完全使用GitFlow,但只是掌握,开发和功能分支,我的陈述的有效性仍然存在。我在很多项目中都是这样工作的,而且效果很好。此外,如果您认为需要另一个分支来集成功能以用于将来的版本,请创建一个新的" next_release"或者"未来"为他们分支并将它们合并到那个分支,而不是开发。然后定期从开发中刷新未来,因为您还希望在将来的版本中使用当前版本中的功能,但反之亦然。我不相信这个额外的步骤是必要的。

答案 1 :(得分:1)

这就是git的工作方式。您需要为每个功能创建单独的分支。

答案 2 :(得分:1)

一旦你合并一个分支与另一个分支,合并分支提交就会在主分支上提交。

您可能想要做的事情甚至不在开发分支上进行开发,而是针对每个功能(当然是序列化功能)进行分支,然后单独检查在将许多功能分支的包合并到开发分支之前的错误。

要消除进入开发分支的错误,您需要让代码在功能分支上运行,然后合并或通过还原功能分支来还原更改使用git revert然后再次合并分支(有效地仅还原它引入开发分支的提交

恢复开发分支(或层次结构中的任何更大的分支)在业界通常是不明智的,除非您只合并一个功能...因为不同的提交可以在它们之间建立依赖关系并且可能导致恢复比它解决的伤害更大。

要更好地恢复阅读this guide by atlassianavailable documentation

答案 3 :(得分:1)

  

你是对的,我们的工作流程与传统的GitFlow不同。特征   分支完全独立地合并为E developbeta

     

测试/批准新功能后,会在同一功能分支

中生成新的拉取请求
        f2--f2--f2   (f2)
       /          \
d--d--d--D1-------D2 (develop)
\       /
 f1---f1
  

一堆不需要/不相关的功能分支提交也合并到“beta”中

奇怪:那就像f2在D2合并提交中一样(有f2但也有f1)。

要进行测试,您可以尝试使用命令行cherry-pick the exact commits you want,然后merge them with --squash

git checkout -b tmp develop
git cherry-pick  $(git merge-base develop f2) f2
git checkout beta
git merge --squash tmp

通过这种方式,您可以验证只能获得您想要测试的f2合并分支,而不是所有其他功能。
一旦验证了,我们就可以从GUI(例如SourceTree)

开始做同样的事情

答案 4 :(得分:1)

你说将功能5合并到测试版中也会将功能1-4带入测试阶段。如果是这样,功能1-4的提交肯定在功能5分支中。有三种方法可能发生:

  1. 特征5在特征1-4合并到开发之后从开发中分支出来。

  2. 在功能1-4合并到开发中后,Develop被合并到功能5(upmerge)。

  3. 功能1-4直接合并到功能5中。

  4. 请注意,分支不仅包含直接提交给分支的提交,还包括从repo开始到分支点的所有提交,以及分支中的任何提交都合并到分支中。

    顺便说一句,即使你改变了' merge'到了'' rebase'或者'开发'到任何其他分支。

答案 5 :(得分:1)

我会按照以下步骤进行。

  • 从develop。
  • 创建的功能分支
  • 完成功能后,将它们合并为开发分支。
  • 当测试时间到来时,我将创建一个测试分支并在那里进行测试。我将修复测试中出现的任何错误。
  • 一旦我的测试全部成功,我将分支合并为master和develop。
  • 然后我会将我的代码从master环境发布到Beta环境。

我会记住以下事项。

  • 如果特定版本不需要某个功能,我不会将该功能合并到develop分支。
  • 如果我在测试时无法解决任何错误,我将不会发布该代码,因此在问题中我会解决所有错误并将释放整个代码。