使用Git的最佳方式一直存在争议。那是因为Git本身只指定了基本的分支操作,这使得它的使用模型:分支模型——经常成为用户争论的焦点。虽然Git分支模型可以帮助开发人员在更改代码库时减少冲突。GitFlow,是一种经常推荐给Git用户的分支模型。也许你一开始对GitFlow的逻辑很感兴趣,但是直到你在实践中遇到了一些障碍。毕竟,有无数变数在起作用,没有一种单一的分支模型适用于所有情况。不过,值得高兴的是,作为经典GitFlow模型的变种,增强版GitFlow模型简化了GitFlow中较为常见的操作,同时保留了主要优势。经典GitFlow模型的荣耀和苦难自从我发现GitFlow在开发具有重要价值的产品时有多么伟大之后,我就一直是GitFlow的坚定拥护者。价值的显着增加需要花费大量时间来证明,例如基于scrum的开发中通常使用的两周以上的冲刺。当产品还处于初期开发阶段,即没有产品,也没有产品的真正用户时,团队可以把所有的东西都放在master分支上。其实这样很好:这种策略可以实现最快的开发速度。但是在生产环境中情况会发生变化。例如,如果生产中有一个关键问题需要立即修复,那么对于开发团队来说,必须回滚现有已完成的代码才能部署修复的代码。在没有适当测试的情况下部署代码,无论代码被认为是不成熟的还是开发良好的,显然都是不可取的。这是分支模型的标志,包括GitFlow。任何复杂的分支模型都应该回答这样的问题:如何将下一个版本与人们当前使用的版本隔离开来;如何用下一个版本更新那个版本;以及如何将任何关键错误修复代码引入当前版本。GitFlow通过分离“main”(生产或“当前版本”分支)和“dev”(开发或“下一版本”分支)分支来解决这些问题,并提供使用功能/发布/修补程序分支的所有规则基本场景。它有效地解决了发布开发工作流程中的许多令人头疼的问题。然而,即使是非常适合经典GitFlow模型的项目,我也遇到了它可能带来的典型问题:GitFlow很复杂,有两个长期存在的分支,三个临时分支,以及分支之间的严格规则。这种复杂性更容易出错并增加修复它们所需的成本。release和hotfix分支需要“双重合并”——合并到主分支,然后合并到devlop分支。有时你会忘记两者都做。您可以使用脚本或VCSGUI客户端插件来简化GitFlow分支,但您必须首先为参与给定项目的每个开发人员的每台机器设置它们。在CI/CD工作流中,一个发布通常有两个最终版本——一个来自发布分支本身的最新提交,另一个来自合并提交到主分支。严格来说,应该使用main中的一个。但这两个通常是相同的并且可能会造成混淆。增强的Git流程在产品首次公开发布之前,为了开发工作流程的速度和简单性,将所有更改直接提交到主分支绝对是有意义的。因为还没有产品,所以团队不太可能需要尽快修复产品错误。因此,在这个阶段,按照传统GitFlow模型的建议执行分支管理是多余的。然后我们接近初始版本,之后我们将不再愿意直接提交到主分支。我们进展迅速,业务优先级并没有为建立坚如磐石的开发流程留出太多空间。它有足够的自动化测试让我们有信心将我们的主要分支保持在发布就绪状态。这似乎是经典GitFlow模型的有效案例。拥有独立的主分支和开发分支。然而,后来我做了一些改变。起初在我看来,对GitFlow做一些“补丁”有点过于激进了。我觉得这可能会打破GitFlow的主要思想,从而达不到目的。但经过进一步思考,我意识到这些调整实际上并没有破坏GitFlow。同时,他们解决了上述所有问题,使其成为更好的Git分支模型。下面,我将这套方法分享给大家,帮助开发者克服传统GitFlow的不足。与传统GitFlow的相似之处:开发隔离对于增强GitFlow中的工作隔离,仍然有两个长期存在的分支:main和development。经典GitFlow功能分支没有正式的命名方案。当功能准备就绪后,只需从devlop分支出来并合并回来进行开发即可。团队可以使用他们喜欢的任何命名约定,或者只是希望开发人员使用比“我的分支”更具描述性的东西。增强的GitFlow也是如此。挤压合并我强烈建议在特性分支中使用挤压合并,以在大多数情况下保持良好的线性历史记录。没有它,当团队一次处理少量功能分支时,gitgraph(gitlog-graph)日志可能看起来很草率:但在这种情况下,即使您对视觉效果也很好。没有压缩,提交的历史视图-包括正常的git日志(没有-graph)和一些相当不连贯的日志,即使对于最简单的合并场景也是如此:使用压缩合并你需要知道的是原始功能分支提交历史将是丢失的。与经典Git流程的区别:发布和修补程序让我们看一下发布周期,因为这是您要做的主要事情。当我们想要发布我们在开??发中积累的内容时,它严格来说是main的超集。在此之后,经典Git流程和增强版Git流程之间的最大区别开始了。增强版GitFlow中的发布分支在发布方面,使用增强版GitFlow的每一步都与经典GitFlow不同:发布是基于主分支,而不是devlop分支。您可以用有意义的东西标记主分支的当前提示。我采用了ISO8601格式的基于当前日期的标签,前缀为“v”——例如:v2020-09-09。如果一天内碰巧有多个版本(例如修补问题),则可以根据需要在格式后附加连续的数字或字母。请注意,标签通常与发布日期不对应。它们只是在那里强制Git在下一个发布过程开始时保留对主分支的引用。使用gitPushorigin
