前言

「A successful Git branching model」 这篇文章,应该是我第一次真正开始从 workflow 的层次来思考和看待 git 的使用问题。

而实际根据文章中提到的 「gitflow」 来进行实际项目代码演进的时候,发现无法完全契合我们的实际需要。综合陆续对 git 的各种主流 workflow 的了解。提炼出一点:没有万能的 workflow,只有最适合的 workflow。

而这篇文章,就是来讨论一下如何挑选、使用、优化项目的 git workflow。

原则

在对 git workflow 进行调研的过程中,「Git Workflows That Work」这篇文章让我产生了一些启发。特别是其中他提到的选择 workflow 的 guildelines ,我认为可以作为我们针对自己身实际需求进行 git workflow 设计的准则。特此引用并翻译如下:

  • Branches should be used to represent a single deliverable request from the business- like a single user story or bug fix. Something that can be approved by the business that contains everything needed for that single request to be released- and nothing more!

    「Branch 仅用于唯一且独立的需求。」

    每一个分支必须单独代表一个来自需求侧的可发布内容,比如一个 userstory 或者 缺陷修复。这个来自需求侧的可发布内容内容,包含了且只能包含所有这次发布所需要的东西。

    这条强调了 branch 的独立性、完整性,以及 branch 的开发目标的唯一性。

  • The longer a feature branch lives without getting merged in for a release, the greater risk for merge conflicts and challenges for deployment. Short lived branches merge and deploy cleaner.

    「一个分支 merge 到 release 时间越早越好。」

    一个功能分支过于长时间的独立维护,而不合并到 release 分支中,会对开发者带来极大的风险和挑战。开发周期短的分支,会有更简洁清晰的合并以及发布。

    这里提到的风险,意味着合并冲突出现概率、以及回归测试范围。

  • Business owner involvement in your workflow is essential. Don’t merge, don’t deploy, don’t work without their input. Otherwise pain and tears will ensue (or worse).

    「万物由需求而生」

    Business owner 必须要参与到你的 workflow 中来,不要在没有需求的时候做合并,发布和其他工作。不然接踵而至的必然是血和泪。

    这段描述的有点奇怪,但是可以理解为不要做没用处的事情,开发过程一定是由需求来指导的,所以没有需要,不要动代码。比如说你的分支都是以需求名称命名,或者发布版本命名,而merge,必然代表着这些需求或者版本的完成和上线。

  • Avoid reverts. Test, test, test your branch before a merge. When merging use git merge –no-ff, which will ease merge reverts if really needed.

    「避免 revert 。」

    避免 revert 。在 merge 之前,记得在你的分支上测试!测试!测试。不过使用 git merge --no-ff 命令来完成 merge 操作,将会让你在实在需要进行 revert 操作的时候更简单。

    关于git merge --no-ff 命令,看这里

  • Your workflow should fit how you release. Do you release continually, multiple times a day? Do you have 2 week sprints with completed work to release on a regular schedule? Do you have a business Change Control Board where all released items must get reviewed and approved first? Does someone else run your releases, like the Operations team or a Release manager? Your branching and merging strategy needs to make releasing easier.

    「根据发布流程选择 workflow」

    你的 workflow 需要适合你的发布方式。考虑你是否每天都会多次、持续的进行集成发布?你是否采用了2周的 sprints 周期来完成你的需求,并统一发布?你是否有一个需求管理面板,并且要求所有的发布内容必须经过管理面板上的 review 和 批准?你的发布类容是否被其他人引用,比如配置管理团队或者发布管理团队?你的分支拉取和合并策略必须使你的发布工作更加容易,而不是更难。

    同样的,对于产品的发布环境,是否有完善的 testcase ,充分自动化的测试平台和工具,以及明确的验收标准。决定了发布的成本。在发布成本较高的时候,不要因为你的workflow ,导致平白多出不需要的发布次数。

  • Complicated workflows drive people crazy. Make it simple. Review your workflow and ask how you can simplify it. In actively making things more simple, you will also make them easier to understand and work with as well as easier for others to adopt and maintain.

    「越简单越好」

    复杂的 workflow 会让每个人抓狂。经常回顾和总结现有的 workflow ,找到让它更简单的方法。实际上,workflow 越简单,越容易被大家理解,从而长期保持下去。

    举个简单的例子,release 分支完成了测试,为什么非要 merge 到 master 分支上再 deploy 。如果没有为什么,是否可以直接在 deploy 分支上发布?

正确选择 workflow

如何正确选择 workflow 是我目前也在研究的内容,暂时还没有类似于 「选择 workflow 的黄金法则」之类的结论出来。不过可以先看看我们能了解到的不同 workflow 对应于不同情况的优缺点分析。

github workflow

github 大家都用过,他的这个工作流程典型特征是大家都直接从 master 分支拉取一个 feature 分支,开发完了以后,直接merge回 master 分支。这个比在「A successful Git branching model」 中提到的流程要简单太多。

使用这个模式的问题,就是如何保证 master 分支上的内容的可发布性和可测试性。由于没有专门的 develop 分支进行功能分支合并,没有专门的 release 分支进行测试验收,所以 master 分支上很容易出现无法发布的临时产物。

所以当使用这个 workflow 的时候,团队必然需要具备这样的条件:

  1. 各个feature 之间的修改内容的高度不相关性。这样合并的时候才能有较低的冲突概率。
  2. 高覆盖率的测试工具,这样能在 feature 分支合并之前完成功能验收,保证合并之后的缺陷率。
  3. 高效的测试回归流程,这里可以通过持续集成工具上部署高自动化测试流程将merge 操作和回归测试自动化的完成,从而保证每次merge 操作都能快速的完成回归测试。保证 master 分支上的可用性。

在这种模式的启发下,可以考虑使用 rebase 命令来代替 merge 命令,从而时你的 git 记录就像 master only workflow 一样干净整洁。

你可能会记得:永远不要用 rebase 这个建议。但是只要你理解 rebase 的含义,也是可以用的。关于 rebase ,我觉得这篇文章写的挺好的。

Skullcandy’s workflow

这里不深入探讨 skullcandy 这家公司是具体做什么的了,简单看一下这个 workflow 也是一个比较有代表性的模型。

在这种 workflow 中,通过 QA branch 这个分支,一定程度降低了在 github workflow 中,对验证、测试回归的工具和工作流的要求,在这个分之中,将开发人员和测试等其他验收人员的职责通过 branch 做了划分,从而测试人员只需要在 QA branch 上做验收测试,并且由于 QA branch 分支的合并节奏是可以控制的,所以可以根据发布周期来控制 QA branch 分支上的合并时机。

这种 workflow 应该说比较适合敏捷开发过程中固定周期的发布行为。通过固定的敏捷周期来约定 QA branch 的同步时间。

这种 workflow 的坏处,由于无法第一时间快速的 将 freature branche 上的内容进行合并,验收。这样会带来后续更高的代码冲突概率和更迟的缺陷修复时间。

master only workflow

这个workflow 比 github workflow 更进一步。但是对测试、发布的要求奇高。

过去我竟在个人独立项目中使用这样的 workflow 进行开发,自然这种情况下我是不需要回归测试、发布等流程的。

另外 stackworkflow 上的这个答案中提到的建议,也说明了使用分支的优势。

Git workflow 选型分析相关推荐

  1. 实用 Git Workflow

    创建分支 分支是 Git 的核心概念,同时 Git Workflow 也是基于分支进行操作. 当你新增功能或修复 bug 时候,新建一个分支是一个不错的选择,这将不会影响主分支 master. 所以你 ...

  2. 用户请求队列化_分布式消息队列选型分析

    高并发架构是成为架构师的必修课,而消息队列,则是王冠上最闪亮的那颗明珠!能否驾驭消息队列这款高并发神器,亦成为架构师的试金石.本文将从队列本质.技术选型两个方面,给大家整理下个人心得,希望能对大家有所 ...

  3. Git workflow

    Git workflow 大神镇楼: 这人不用说,应该都认识,他基本干了两件事,一个是Linux,一个就是git.每一件事,都在IT史上创建了一个巨大的Tag. Git是什么 Git能干什么? Git ...

  4. buck电路pscad仿真_100kVar SVG模块主电路选型分析[李博士]

    欢迎加入技术交流QQ群(2000人):电力电子技术与新能源 905724684 高可靠新能源行业顶尖自媒体 在这里有电力电子.新能源干货.行业发展趋势分析.最新产品介绍.众多技术达人与您分享经验,欢迎 ...

  5. 消息中间件---选型分析

    消息中间件选型分析 --从Kafka与RabbitMQ的对比来看全局 有很多网友留言:公司要做消息中间件选型,该如何选?你觉得哪个比较好?消息选型的确是一个大论题,实则说来话长的事情又如何长话短说.对 ...

  6. 【十一】消息中间件选型分析——从Kafka与RabbitMQ的对比来看全局

    转载:消息中间件选型分析--从Kafka与RabbitMQ的对比来看全局 一.前言 消息队列中间件(简称消息中间件)是指利用高效可靠的消息传递机制进行与平台无关的数据交流,并基于数据通信来进行分布式系 ...

  7. 系统监控——监控系统选型分析及误区探讨

    本文摘自于朱政科撰写的<Prometheus 云原生监控:运维与开发实战>,重点介绍了在监控系统选型中应该考虑的问题.在本文中,你将会了解监控应用程序的黑盒和白盒方法,也会了解监控执行检查 ...

  8. 监控之美——监控之美-监控系统选型分析及误区探讨

    朱政科 读完需要 29 分钟 速读仅需 10 分钟 本文摘自于朱政科撰写的<Prometheus 云原生监控:运维与开发实战>,重点介绍了在监控系统选型中应该考虑的问题. 上一期监控之美- ...

  9. 分布式锁系列--04关于分布式锁的选型分析02-Redlock的实现原理

    欢迎关注公众号:java4all 上一文分布式锁系列–03关于分布式锁的选型分析01中,我们看到了单节点的redis分布式锁在failover时产生了无法解决的安全问题,因此,Redis的作者anti ...

最新文章

  1. 华为系列交换机日志服务器的搭建
  2. 一个肯德基拖着6个“拖油瓶”的百胜中国,如何赢下中国市场?
  3. dict格式转字符串两种方法的区别
  4. 分布式集群环境下,如何实现session共享三(环境搭建)
  5. linux磁盘分区表解读:只占64字节
  6. Git 下载很慢问题解决方案
  7. mysql 存储引擎接口_MySQL 的基础一(连接池, SQL接口, 查询解析器, 查询优化器, 存储引擎接口, 执行器,)...
  8. java发送文本邮件_1、java实现发送纯文本邮件
  9. 小算法小心情:背包问题就是陪你看花开向阳
  10. python3学习之元组
  11. 712. Minimum ASCII Delete Sum for Two Strings
  12. 多个线程并发执行完成后再执行主线程-java(有点内容版)
  13. 亚马逊多账号注册怎么操作?多账号注册有哪些解决方案?
  14. 全网最全编程学习网站汇总
  15. 图片资源类型转换为bitmap
  16. php的4种标记风格,PHP4种标记风格的认识
  17. python crc16-ccitt
  18. ChatGPT在线网页版和接口
  19. 社区说|浅谈量子计算机和 Cirq
  20. 苹果6s系统更新无服务器,我的iPhone6s国行 系统更新一直显示“正在检查更新”,无法更新是为什么?...

热门文章

  1. Nacos,一款非常优秀的注册中心(附视频)
  2. 湖北首富阎志:成为企业家后再实现自己的文学梦
  3. 如何查阅Spark文档
  4. IT专业应届生求职时一定要注意的几项重点
  5. 项目管理sod_敏捷项目管理七宗罪
  6. tarfile打包下载
  7. C语言 一个 long long 数字转 char 字符串的算法
  8. InnoDB学习之死锁
  9. mysql 创建 innodb_MySQL InnoDB 创建 InnoDB 表
  10. 如何搭建自己的gitlab服务