长期运行未发布代码的Git分支策略


15

在我们的团队中,除了个别的工作单元(故事),我们还有工作时间更长的主题(史诗)。多个故事成为史诗。

传统上,我们为每个故事提供功能分支,并在它们通过质量检查后直接合并为母版。但是,我们希望开始阻止在Epic中发布已完成的故事,直到Epic被视为“功能已完成”为止。我们只会在整个Epic关闭时才将这些功能发布到生产环境中。此外,我们有一个每晚生成的服务器-我们希望所有封闭的Stories(包括那些不完整的Epics的故事)都将自动部署到该每晚的服务器。

关于如何管理我们的仓库来实现这一目标,有什么建议吗?我考虑过引入“史诗般的分支”,在这里我们将封闭的故事合并到相关的史诗分支中,而不是直接掌握。但我担心的是:

  • 我担心如果史诗分支长时间保持开放可能会发生合并冲突
  • 每晚构建需要将所有史诗分支合并为一个“每晚构建”分支。同样,可能会发生合并冲突,这将自动完成

Answers:


23

一个简单的建议:不要那样做。

git分支不适用于长时间运行的代码分支,如此https://blog.newrelic.com/2012/11/14/long-running-branches-considered-harmful/所述。最好将分支视为用于组织单个开发人员在日常级别上的提交的临时性事物。因此,如果他们的名字与某个项目经理(更不用说最终用户)相对应,则可能是在乎您做错了什么。

建议的做法是将连续集成与功能切换逐个分支结合使用以确保:

  • 所有代码都始终集成(至少每天,最好是更频繁地集成)
  • 什么得到部署是明确的控制之下。

1
我怀疑这可能是一个流行的答案!我主要关心的是始终保持“实时”和“下一步”实施的开销,并且还要求从事某项功能的开发人员必须事先知道将更改构建为新的并行功能,而不是升级(/替换)新功能。现有功能。猜猜这需要团队中更大的思维方式改变。
Sitati '16

使用分支来开发代码是可以的,只是永远不要使用它们来存储代码。因此,如果不确定某个任务是30分钟修复还是2周返工,则从分支开始。您一知道,就可以合并或重构为抽象/切换,然后合并。
soru

@Sitati:我刚刚合并了过去四个月中功能分支中的一些代码。同时,devel我们已经从Autotools切换到CMake,引入了Travis CI,重构了代码。最后,devel与尝试合并新功能相比,更容易理解新功能并将其手动应用到该功能。我们还邀请新的硕士生在其分支中开发新功能,当他们开始撰写论文时就将其分支。一年后,他们推出了它,并且没有进行任何合并的尝试,因此日复一日地合并变得越来越困难。
Martin Ueding '17

2
链接的博客文章现在已有5年历史了。我讨厌功能切换。长期分支,定期从main合并回功能分支并向长期功能分支添加持续集成有什么问题?
杰森·凯利

CI是流程的名称,而不是工具的名称。如果您有多个功能分支,则通常不会将它们相互持续集成。这意味着迟早发现问题。
soru

1

我认为这是一个非常普遍的问题,归结为选择在对功能进行编码后而不是在编码之前选择要包含在发行版中的功能。

例如。

我的产品v2具有功能A,B和C。B和C是相关的,除非C也完成了,否则我不希望释放B。

我有三个开发人员在功能上同时工作。

我有一套固定的发行日期D

B完成并合并,A完成并合并。C被延迟...我该怎么办?

我认为没有针对此问题的技术解决方案。您要发布仅包含功能A的未经测试的产品版本。除非您合并并测试所有可能的功能组合,否则这总是有可能的。

解决方案是更人性化的解决方案。您错过了发布日期,必须将其推迟。


1

这是一个棘手的问题,但很多人都面临这个问题。我更喜欢使用Gitflow设置作为起点。

开发->正在使用
Master的新内容->需要测试生产的成品->已发布到生产中的东西。

在次要(较短)功能上,我从开发创建了一个分支,然后在那里进行工作,然后将该分支合并回开发。

在主要(长期)功能上,我从开发中创建一个分支,从该分支中​​创建较小的分支,然后合并回第一个分支。一旦主要功能完成,然后返回到开发分支。

我会定期(取决于项目)将开发合并回主版本,然后开始测试周期。如果测试中有任何修正,则在master分支(然后合并到sub分支)中完成。测试期间,开发可以在master分支上继续进行。

任何时候都应将master合并到开发中,并将开发合并到其任何长期子分支中。

主人应该总是(理论上)准备生产。理论上,开发应该始终准备好进行生产。唯一不同的原因是它为测试人员提供了一套可靠的功能来进行测试。

准备就绪后,已测试的master提交将合并到生产中,并从该分支进行生产中的部署。然后,可以在生产分支上进行紧急情况下需要执行的HOTFIX,而不必合并在master(可能有许多未经测试的更改)中。

我正常的树看起来像

 LongTerm -> Development -> Master -> Production    
 LongTerm <- Development      |            |  
     |       Development -> Master         |  
 LongTerm <- Development -> Master         |  
             Development <- Master         |  
                            Master -> Production  

我的一般规则是,任何更改都不会花费超过几个小时的时间。如果确实如此,则需要进行较小的更改。如果它是一项巨大的功能(例如重写UI),那么它将长期持续下去,以便可以同时继续进行正常的开发。长期分支通常仅是本地分支,而开发,母版和生产是远程分支。任何子分支也仅是本地的。这可以使存储库对其他人保持干净,而不会失去git在长期功能集上的用处。

但是,我想指出的是,长期分支的存在是罕见的。通常,我所有的工作都在开发中。只有当我有一个功能(集合)要花很长时间以至于我也需要能够处理普通的开发人员时,才使用LongTerm分支。如果只是应该一起进行的一组更改,那么在完成所有操作之前,我不会合并来掌握。


“在主要(长期)功能上,我从开发中创建了一个分支”-您是否不应该从Production分支中创建新的功能(开发)中的分支?视为Production分支是可发布的代码。
robotron

不,生产已经发布,master领先于生产,development领先于master。如果您不使用已有订单的代码,则像对订单总额添加税之类的新功能毫无意义。
coteyr

但是,如果您是从dev分支出来的,后来又合并回来了,那该分支机构(以及后来的master和Production)会不会合并其他人对分支进行的所有dev更改呢?其中一些更改可能未获得质量检查批准。也许是在谈论发布管理的不同方法。
robotron '17

是的,这就是重点。QA在master中的特定SHA上进行测试,但是您不能为此保留开发能力。
coteyr

“在主服务器上的特定SHA上进行质量检查”->质量检查是否可以独立测试每个新功能?让我来为您介绍一下我的团队面临的典型场景:假设您在同一代码库上有两个长期运行的项目:过去一个月中,项目A处于质量保证阶段,而另一个月将进行质量保证。项目B在过去的6个月中一直在开发中,现在可以进行质量检查了。由于存在许多细微的业务规则错误,所以项目A被合并到主项目中,并且肯定不能进行生产。我们如何处理项目B?A和B必须一起测试以检查交互(B在合并期间不会引起冲突)。
robotron
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.