敏捷项目的Git分支策略

12

我有一个项目位于Git Stash存储库中。 该代码将部署在四个环境(Dev,Test,Stage和Prod)中。 我们遵循敏捷方法。 因此,开发团队既负责发布活动又负责未来发布(非发布)活动。 根据此要求,我必须创建分支。以下是我的计划。

三个稳定分支:主分支,发布分支和开发分支。

主分支是默认分支。 开发分支将从主分支创建。 发布分支将从开发分支创建

特性分支->它们将从开发分支创建。 每个开发人员都有一个特性分支,并在完成后将代码合并到开发分支中。 因此,从开发分支进行的dev环境部署将会发生。

如果更改需要进入测试环境,则有两种方法。 其中一种是将develop分支与release分支合并(测试环境部署将从release分支进行)。 由于develop分支可能具有发布和非发布更改,因此我们无法实现这一点。

另一种方法是直接将功能分支合并到发布分支中。 这样,每个开发人员的更改都可以合并到发布分支中。 我不确定是否可以实施此方法。 请问是否可以使用此方法? 有没有其他方法来处理这种情况。

分支:

主分支---> 开发分支 ---> 发布分支

开发分支 --- 特性分支1 | 特性分支2 | 特性分支3


部署:

开发分支用于--> dev部署

发布分支用于--> 测试部署

主分支用于--> stage和prod部署

我不能将develop分支合并到release分支中。 因为develop分支也有一些非发布更改。 我只需要在release分支上进行发布更改。 特性分支是否可以直接合并到发布分支中? 最好的做法是什么?


你读过 http://scottchacon.com/2011/08/31/github-flow.html 吗? - Thong Kuah
非常感谢。我已经看了一下。看起来他们每天都推送代码。但是我们按照敏捷开发和发布方式工作。 - Ela
2个回答

15

听起来,你已经非常接近选择Git Flow了。实际上,如果我没记错的话,这已经是你所描述的策略的基础。这很棒。

我听到你的主要关注点是,你想要一个非发布的“develop”分支,有点像一个“尝试一下,可能不会编译”的环境/分支。Git flow确实倾向于生产“流”。也就是说,一旦从功能分支合并到develop分支中的任何内容,它就几乎预定为下一个(非紧急)发布。

Git flow对如何处理此问题的建议是,在一个任务/功能被合并到develop之前,不要合并它,直到它准备好以便在下一个分期/产品发布时进行一些修复。在git flow中,您将始终使用非快进式合并(git merge --no-ff FEATURE_BRANCH_NAME),以便如果您接近分期/产品发布,并且此功能无法准备好,您可以反向合并(单个)合并提交,从而将其从developrelease-branch中删除。

我猜这方面需要更长时间的讨论,但我只是想提出两种可能满足你想法的方式:

1) 有两个develop分支: 一个用于开发,develop分支,它将在一些QA或其他之后很快安排到分期和产品发布。还有一个用于实验性的东西,将进入dev/test环境(例如通过持续部署)。让我们称之为long-term-develop(这是一个糟糕且太长的名字,所以请取一个更好的名字,否则你的团队会讨厌你 :))。

想法:

  • develop分支应经常合并到long-term-develop分支中,以始终保持其更新。
  • 您可能需要两个开发环境来测试,每个分支一个。
  • 危险: 从 long-term-develop 创建的分支(可能是错误的)合并到 develop 可能会将更多未准备好的内容拖入到 develop 分支中。解决方案可能是 1) 将 feature-branch 合并为非快进方式到 long-term-develop 和 2) 将此提交以 cherry-pick 合并到 develop 中。但这是容易出错和有点复杂的,一个错误的合并可能会破坏整个 develop 分支,污染其中未准备好的内容。
  • 2) 只有一个 develop 分支(如您所建议的),并从 master 创建 release-branches

    这可能是迄今为止最简单的方法。每个开发人员需要付出一些额外的努力,但错误率较低。

    步骤如下:

    • 在每个 sprint/development-cycle 的开始,release-manager 基于 master 创建下一个 release-branch。例如 release-sprint-42,当创建时,它等同于 master 分支。
    • 开发人员使用基于 develop 的 feature-branches。像您当前建议的那样,一旦准备好进行测试等,他们将 feature-branch 合并到 develop 中。
    • 如果特性是“正确”的且可工作的,则从将 feature-branch 合并到 develop 时创建的合并提交使用 -m 选项在 release-sprint-42 中进行 cherry-pick,例如 git cherry-pick -m 1 COMMIT_HASH。在这里,了解您选择的父级非常重要(在我的示例中为父级 1)。开发人员应阅读并理解:http://git-scm.com/docs/git-cherry-pick

    想法:

    • 存在一个问题,即在develop分支中工作正常的功能,在release-sprint-42分支中可能由于缺少依赖而无法使用。因此,谢天谢地,我们有了分阶段环境和内部截止日期 :)
    • 挑选代码并不是最容易的事情。但绝对是尝试避免将不需要的代码带入错误分支合并的最佳方法。

    总结

    哪种选择对您来说最好,取决于您的开发方式。如果您有2个轨道,例如“日常支持内容”和“计划在今年12月发布的我的大功能”,则可以选择2个分支。如果长期开发不仅是1件事,而是多个事情且正在进行(即通常有很多任务跨越多个sprint / cycle),我会选择第二种选择。

    理想情况下,我会默认推荐一种策略,即将内容拆分为足够小的部分,并且sprint足够大,以便任务/功能通常可以在1个sprint内完成(即合并和部署!)。但是根据经验,我知道愿望很少能够实现 :)

    最后一件事:我真的非常鼓励您不要拥有1个发布分支(永久性),而是为每个sprint / cycle创建一个新的发布分支,例如release-sprint-42release-sprint-43等。 (无论您是基于理想git流中的develop分支还是我建议的第二种情况中的master分支创建它)。 根据我的经验,拥有永久的发布分支通常会导致丢失内容,合并问题和其他问题。 除此之外, master develop 应该是永久分支。

    期待这次讨论 :)


    1
    非常感谢您提供详尽清晰的信息 :) 我真的很感激。正如您所建议的,只有一个develop分支就可以了。但我的问题是 - 功能分支是否可以直接合并到发布分支?功能分支与发布分支没有直接关系,因为它们是从develop分支创建的。在这种情况下,会起作用吗?在我的情况下,创建发布分支行不通。所有构建都应该自动化到生产环境。分支名称应该永久稳定。我们不能为每个发布创建分支,因为这需要手动操作。 - Ela
    我再次强调,我预测在未来的某个时候,仅使用长期分支作为您的阶段/环境可能会带来麻烦。但是我会让您自己进行实验,并希望证明我是错误的 ;) 另外,我必须强调采用cherry-pick合并的重要性(而不是普通的3点或ff合并)。显然,风险在于“普通”合并将把特性分支中的任何增量合并到发布分支中 - 无论更改是在分支中还是在分支创建之前引入的(例如在develop中)。让我知道它的运作情况,这是一个有趣的案例 :) - Frederik Struck-Schøning
    非常感谢您的快速回复。我已经听说过 cherry-pick。正如您所说,它有点棘手...我将尝试设置分支并进行普通合并...我会尝试并让您知道是否有任何问题。再次感谢 Frederik :) - Ela
    我的问题与发布分支有关,理想情况下,一旦我们创建了一个发布分支并从该发布分支进行构建,如果构建正常,则此构建将上升到生产部署。那么在这种情况下,我们应该在什么时候将此发布分支合并到主分支?如果我在生产部署后从发布分支更新主分支,那么存在风险,因为生产部署是从发布分支进行的。我认为没有必要使用主分支,这对于发布经理来说是额外的负担,需要更新主分支,我认为多个发布分支是有意义的。 - Gautam Sharma
    @GautamSharma 在我的项目中,我们也有同样的情况。在发布版本后,在生产环境中部署后,我们将其合并到主分支。是的,维护主分支需要付出一定的努力,但至少我们始终拥有一个简单的分支,反映了生产环境中的情况。当你必须回答“我当前安装的软件版本是什么?”这个问题时,这非常有用。 - k4ppa
    显示剩余2条评论


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接