【问题标题】:Team git flow with testing in mind考虑到测试的团队 git 流程
【发布时间】:2018-01-24 19:12:59
【问题描述】:

我们计划了一个 git 工作流程,我们认为该工作流程运行良好,但遇到了问题。

在源树中 我们有4个主要分支机构

  1. _dev(我们从中创建特征分支,每个特征分支对应一个 JIRA 任务)
  2. _qa(一旦功能准备就绪并在 _dev 上审查代码,我们会将功能分支合并到其中)
  3. _next-release(当一个特性被 QA 批准时,我们将特性分支合并到该分支)
  4. ma​​ster(我们在 sprint 结束时将整个 _next-release 分支合并到其中,从而仅合并已批准的功能)

我们还有 版本分支,当版本发布时,我们会将主分支合并到其中(我们这样做是为了确保我们可以返回该分支并在必要时进行调整,因为我们的产品是可安装)

我们的问题场景是:

  1. Dev1 创建 feature1(来自 _dev 的分支)
  2. Dev1 将 feature1 合并到 _dev(假设此时它正在等待代码审查)
  3. Dev1 创建并开始处理 feature2(再次从 _dev 分支)
  4. Dev1 将 feature2 合并到 _dev 并通过代码审查。
  5. Dev1 尝试将 feature2 合并到 _qa

结果:虽然 feature1 还没有准备好,但 feature1 和 feature2 似乎都合并到了 QA 中。

我们通过右键单击分支并选择“将 featureX 合并到当前分支”来合并

请注意,我们有 4 个环境(应该)反映每个分支,因此 QA 可以检查功能。

为什么将特征与我们不想合并的特征合并在一起?

什么是常见的工作流程,它允许仅将经过验证的功能合并到一个版本中,同时允许 QA 环境检查功能并允许反映每个功能生命周期的干净历史记录 - 开发 -> QA -> 发布 -> 版本

谢谢

【问题讨论】:

    标签: git bitbucket workflow branching-and-merging


    【解决方案1】:

    首先,请注意:如果您坚持此工作流程并解决当前问题,您将面临其他更微妙的问题。像这样的工作流试图在开发生命周期的多个阶段返回到单个功能分支的合并,但会遇到麻烦,因为它们忽略了不同分支上的更改之间可能存在的交互。

    话虽如此,让我们专注于您的一些问题。您的场景(带插图)如下所示:

    首先,您有 _dev_qa 分支。 (其他的,为了简单起见,我们暂时搁置。)

    A -- B -- C <--(_dev)(_qa)
    

    我假设我们开始的状态是 _dev 中的所有内容都已通过 _qa(当然所有已通过 _qa 的内容都应在 _dev 中),所以他们指向相同的提交。这可能会遗漏一些会阻碍您的工作流程的复杂因素,但它仍然足以让我们了解您当前面临的问题。现在

    Dev1 创建 feature1

    A -- B -- C <--(_dev)(_qa)
               \
                D -- E <--(feature1)
    

    Dev1 将 feature1 合并到 _dev(假设此时它正在等待代码审查)

            (_qa)
              |
    A -- B -- C ------ M1<--(_dev)
               \      /
                D -- E <--(feature1)
    

    Dev1 创建并开始处理 feature2

            (_qa)         F -- G <--(feature2)
              |          /
    A -- B -- C ------ M1<--(_dev)
               \      /
                D -- E <--(feature1)
    

    Dev1 将 feature2 合并到 _dev 并通过代码审查。

            (_qa)         F -- G <--(feature2)
              |          /      \
    A -- B -- C ------ M1 ------ M2 <--(_dev)
               \      /
                D -- E <--(feature1)
    

    Dev1 尝试将 feature2 合并到 _qa

    好的,那么这里会发生什么?好吧,feature2_qa 的后代(因为我们从_qa_dev 在同一个地方开始)。因此,您可以将_qa 快进到feature2(即使您不这样做,生成的合并提交也将具有与您拥有的内容相同的内容)。但是feature2植根于M1feature1 的更改可从 feature2 访问,但无法从 _qa 访问,因此合并将包括它们。

    如果我们从_dev 可访问_qa 开始(而不是两个指向同一个提交),则完全相同的分析将成立。如果出于某种原因,_qa 包含更改可从_dev 访问,我们可以有类似的东西

           Q <--(_qa)     F -- G <--(feature2)
          /              /      \
    A -- B -- C ------ M1 ------ M2 <--(_dev)
               \      /
                D -- E <--(feature1)
    

    在这种情况下,git 会在 _qafeature2 之间找到一个合并基础——即一个共同的祖先。那将是B。然后它将“B_qa 之间的更改”与“Bfeature2 之间的更改结合起来。同样,Bfeature2 之间的更改包括 @ 所做的更改987654357@ 因为feature2 植根于M1(即feature1 被合并后的一个点)。

    在所有情况下,要点都是相同的:在大多数情况下(包括在合并期间),git 不会将提交(或它们之间的增量)视为“属于”这个分支或那个分支。相反,它关心是否在合并基础的路径上发生了更改。

    通常可以让 git 单独查看“来自分支”的更改的一种情况是 rebase。但是,您的工作流程需要大修才能利用这一点,并且会导致其他并发症。这不是我在这里推荐的路径。

    另一种看起来可以修补工作流程的方法是要求开发人员在 _dev_qa 之间的合并基础上启动新功能分支。 但是这可能只会把罐子踢下去(除非更改在达到_qa 后将始终“保持秩序”,这不是一个合理的假设 - 特别是如果 QA 发现了缺陷)。此外,这增加了为一个功能完成的工作与为下一个功能完成的工作之间的隔离,最终意味着您可能需要处理更多的合并冲突。

    无论如何,我认为这解决了您的为什么问题。至于什么

    好吧,虽然您使用“git flow”作为“分支和合并策略”的通用术语,但实际上 git flow 是特定分支和合并策略的名称。我建议阅读它。您列出的需求并非独一无二,甚至不常见,因此与其认为您必须自定义此流程以满足这些需求,不如研究人们如何使用此流程满足这些需求。

    【讨论】:

    • 嘿,马克,感谢您的详细回答 :) 我已经研究了 GitFlow,但问题仍然存在 - 我们如何才能合并“转发”仅批准的功能?据我所知 - 在 GitFlow 中,您稳定了开发分支,然后从它分支出一个版本,如果它是 sprint 的结束并且没有测试 1 个功能怎么办?谢谢! :)
    • @EdoMagen 那么未经测试的功能不属于dev 分支。
    • 那么质量检查在哪里进行?每次合并到 _dev 和 _qa 时,我们都会自动部署。 _dev 是我们的集成环境,_qa 是正在测试的,每个分支都反映在我们公司的一个子域中(dev.xxx.xxx 和 qa.xxx.xxx) 合并前是否还有其他 QA 选项和批准每个功能?跨度>
    • @EdoMagen - 我看到的最常见的答案是将 dev 反向合并到功能分支并将结果部署到 QA 环境。 (这样您就可以使用已经过 QA 的所有内容来测试候选功能,而没有其他任何内容。)IMO 对任何工作流程都没有“完美”的答案,因为您无法解决可能变得重要的功能的每个组合。关键是合并到一个长期存在的分支应该是一个关于发布准备级别的提交声明,因为退出合并(不丢弃分支)并不是那么容易
    猜你喜欢
    • 2019-06-08
    • 2019-09-03
    • 2013-01-20
    • 2016-01-06
    • 1970-01-01
    • 1970-01-01
    • 2012-01-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多