【问题标题】:git branch workflow policygit 分支工作流策略
【发布时间】:2019-10-26 12:06:58
【问题描述】:

我是 git 新手,对 Git 有一点了解。
我公司目前有 1 个项目,项目分为 5 个产品。每个产品都由不同的团队处理。

目前我公司的 git 有 5 个分支机构,例如:

  • dev = 此分支供开发人员构建程序 (dev.program.com)
  • test(alpha) = 此分支供测试人员测试程序 (test.program.com)
  • staging(beta) = 此分支用于测试人员测试程序(双重检查错误)和客户端测试程序。 (stg.program.com)
  • staging-trx = staging 的副本,供开发人员确保在投入生产之前从 staging 中挑选樱桃时没有错误冲突。 (stg-trx.program.com)
  • master = 从 staging-trx 合并并准备投入生产 (master.program.com)

这是我们的工作流程。

  1. 开发者完成一个程序,开发者将提交并将文件推送到测试分支,然后测试者将对测试环境进行压力测试。
  2. 在测试人员完成压力测试后,开发人员进行拉取,从测试分支中挑选提交的文件并推送到暂存分支。之后,测试人员将进行 Flash 测试。
  3. 测试人员完成 flash 测试后,开发人员执行 pull,cherry 从 staging 分支中挑选提交的文件并推送到 staging-trx 分支,之后开发人员会将 staging-trx 合并到 master 分支。

但是我有一些问题。

假设一个团队有 2 名开发人员(安迪和罗伯特)并负责产品 A。

  • Robert 正在处理新功能并修复错误
  • Andy 正在处理已修复的错误

目前,Robert 仍在构建新功能,该新功能将影响某些文件和代码的重大更改。所以 Andy 无法对代码进行任何修改来修复错误,因为几乎所有代码都已更改。

如果我为每一个新功能都创建新的分支,测试人员会发现很难测试,而且会为新功能创建更多的网站。这意味着不仅产品A,还有其他产品会面临同样的问题。

那么,这种情况有什么解决办法吗?

【问题讨论】:

    标签: git gitlab git-branch git-flow


    【解决方案1】:

    这通常是gitworkflow 地址

    您只合并feature 分支,而不是将A 合并到B、B 到C、C 到D 等等。

    每个开发人员(或一组开发人员)都在 feature 分支上工作,并将其合并到 dev 以进行集成测试。

    但是当涉及到合并到额外的开发生命周期步骤(在您的情况下进行测试,然后是 staging、qa、您想要的任何名称)时,您不要将 dev 合并到 test

    您将选定的 feature 分支(最初合并到 dev)合并到您想要的分支(测试、暂存等)

    这样,您只需选择您认为已准备好并一起工作的功能子集,而不是尝试将“未准备好”的功能从 dev 还原,然后将 dev 合并到 test

    detail that model further hereillustrate it here

    有一点很重要:dev 分支(用于将feature 分支集成在一起)是transient:它是为每个新版本创建/销毁的(而不是一个固定的永恒dev分支不时合并到master)。

    您可以重新创建尽可能多的集成分支,以便一起测试功能(开发、测试、暂存等)。
    然后,当准备就绪时,您只需将正确的 feature 分支合并到 master(或任何其他 release 分支),删除您的 dev 分支,然后为下一个版本重新创建它。

    重复一遍:

    feature 分支被多次合并:

    • 一次到dev 进行初始集成测试,
    • 然后相同的feature 分支直接再次合并到test 中(可以进行第二次构建,您不必在feature 中重新构建),
    • 然后直接在staging 中再次合并(每次都是因为feature 分支被认为已准备好进入下一个生命周期开发阶段)

    从(例如)teststaging 采摘樱桃。
    您将已通过 testfeature 分支合并到集成生命周期的下一步(将 feature 合并到 staging 分支)


    目前,Robert 仍在构建一项新功能,该新功能将影响某些文件和代码的重大更改。
    因此,Andy 无法对代码进行任何修改来修复该错误,因为几乎所有代码都已更改。

    是的,Andy 可以在 hotfix 分支中专门维护发布到生产环境中的最新代码。
    Robert 和 Andy 都可以参与该分支,如果那里需要所述修复,他们将负责将他们的修复提交应用到 dev(由于代码已更改,也许该错误修复在 dev 中不再相关)

    Andy 会从热分支合并到测试吗?因为我们的最后一步是test => staging => staging trx => master

    这个答案的全部意义在于说明您不必从A 合并到BC
    对于hotfix 分支,您很少将其合并回其他任何地方,因为devtest 分支的代码自上一个版本以来已经有了很大的发展。您只需cherry-pick将您需要的修复提交回devtest


    feature 已经进入production 环境后,我会销毁那个feature 分支对吧?

    嗯...是的,“销毁”feature 分支将删除指向该分支的指针。
    但是作为所述分支的一部分的实际提交仍然可以从master 上完成的合并提交中看到。没关系,并且对于稍后调试该功能很有用:您可以稍后检查来自所述合并提交的第二个父级的提交,而不是大的最终合并提交:它们是来自旧功能分支的提交。


    虽然新的feature A 分支已经在test 分支中,并且测试人员仍在对新的feature A 进行压力测试,但生产中存在错误,Andy 将修复hotfix 中的feature B 错误分支。

    问题是,在Andy修复了hotfix分支的bug之后,那么Andy应该把当前的hotfix分支合并到哪里呢?
    因为如果有bug,并且开发者已经修复了bug,它不会直接投入生产,测试人员会先做测试,检查bug是否已经真正修复。

    您将需要一个 second test 分支专门用于测试修补程序(不过我会直接在 hotfix 上进行这些测试),然后合并回 master,以更新生产。
    重点是:当您确定并行开发工作时(如“测试功能分支”和“测试修补程序”),需要单独的分支

    但同样,对于错误修复,这是典型的“紧急路径”,对于这种情况,您有一个较短的分支工作流程和一个专用的 test-hotfix 分支(根据需要命名)。

    另一种方法是简单地重置 test 分支,然后只合并回您急需的分支(在本例中为 feature B):测试,合并 B 到暂存等等...一直到master
    最后,一旦 B 准备就绪,您可以使用相同的测试分支重新添加(合并)feature A,并在 B 已经验证的环境中继续对 A 进行测试。

    重置测试的缺点是它会阻止所有其他开发集成。
    这就是为什么最好有一个专门的分支。

    【讨论】:

    • Each developer (or group of developers) works on a feature branch and merge it to dev for integration testing => 是不是说每个开发者在构建脚本的时候环境不一样,那么开发者如果想测试编码,就应该先合并到dev,这样开发者才能做测试?如果是的话,开发者将很难构建程序,因为他们编写脚本后,必须先将脚本合并到开发,然后再进行测试。
    • @BabaCarita 该步骤(将功能合并到开发)可以自动化:推送到专用的 CI(持续集成)系统(Jenkins 或任何其他):它会告诉您:a/ 它编译 b / 如果合并的功能编译通过,则它可以合并到 dev 而不会发生冲突 c/ d/ 如果测试通过。所有的“持续集成”都是为了自动化所有过程,每次将新提交推送到功能分支时都允许完整的测试套件(在开发中)!
    • But when it comes to merge to additional development lifecycle step (test in your case, then staging, qa, any name you want), you do not merge dev to test You merge the selected feature branches (that were initially merged to dev) to the branch you want (test, staging, etc) => 你能解释一下吗?我不明白你对这个的意思。但是从我的理解来看,是不是在已经在开发中的功能并提交测试之后,并且在测试之后进行额外的开发,我在功能分支中再次构建,然后直接合并测试?
    • @BabaCarita 是的,功能分支被合并多次:一次到 dev 用于初始集成测试,然后在测试中直接再次合并相同的功能分支(可能会发生第二次构建,你不要'不必重建功能),然后直接在 staging 中再次合并(每次因为该功能分支被认为已准备好进入下一个生命周期开发阶段)
    • (where a second build can occur, you don't have to rebuild in feature) => 你的意思是我不必重建功能?
    猜你喜欢
    • 2017-10-17
    • 2016-10-29
    • 2021-07-02
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-08
    • 2014-07-13
    • 1970-01-01
    相关资源
    最近更新 更多