技巧 - 如何好一个 Git 提交信息及几种不同的规范
受 Growth 3.0 开发的影响,最近更新文章的频率会有所降低。今天,让我们来谈谈一个好的 Git、SVN 提交信息是怎样规范出来的。
在团队协作中,使用版本管理工具 Git、SVN 几乎都是这个行业的标准。当我们提交代码的时候,需要编写提交信息(commit message)。
而提交信息的主要用途是:告诉这个项目的人,这次代码提交里做了些什么。如,我更新了 React Native Elements 的版本,那么它就可以是: [T] upgrade react native elements
。对应的我修改的代码就是: package.json
和 yarn.lock
中的文件。一般来说,建议小步提交,即按自己的 Tasking 步骤来的提交,每一小步都有对应的提交信息。这样做的主要目的是:防止一次修改中,修改过多的文件,导致后期修改、维护、撤销等等困难。
而对于不同的团队来说,都会遵循一定的规范,本文主要会介绍以下几种写法:
- 工作写法
- 常规写法
- 开源库写法
那么,先从我习惯的做法说起。
工作写法
在我的第一个项目里,我们使用 Jira 作为看板工具,Bamboo 作为持续集成服务器,并采用结对编程的方式进行。
在 Jira 里每一个功能卡都有对应的卡号,而 Bamboo 支持使用 Jira 的任务卡号关联的功能。即在持续构建服务器上示例对应的任务卡号,即相应的提交人。
Jira Bamboo Example
因此,这个时候我们的规范稍微有一些特别:
[任务卡号] xx & xx: do something
比如: [PHODAL-0001] ladohp & phodal: update documents
,解释如下:
-
PHODAL-0001
,业务的任务卡号,它可以帮我们找到某个业务修改的原因,即点出相应 bug 的来源 -
ladohp & phodal
,结对编程的两个人的名字,后者(phodal)一般是写代码的人,出于礼貌就放在后面了。由于 Git 的提交人只显示一个,所以写上两个的名字。当提交的人不在时,就可以问另外一个人修改的原因。 -
update documents
,我们做了什么事情
缺点:而对于采用看板的团队来说,并不存在任务卡号这种东西,因此就需要一种额外的作法。
常规写法
对于我来说,我则习惯这种的写法:
[任务分类] 主要修改组件(可选):修改内容
示例 1, [T] tabs: add icons
。其中的 T
表示这是一个技术卡, tabs
表示修改的是 Tabs, add icons
则表示添加了图标。
示例 2, [SkillTree] detail: add link data
。其中的 SkillTree
表示修改的是技能树 Tab 下的内容, detail
则表示修改的是详情页, add link data
则表示是添加了技能的数据
这样做的主要原因是,它可以轻松也帮我* filter 出相应业务的内容*,如 Growth 3.0 里的 LeetCode:
Growth LeetCode
缺点:要这样做需要团队达到一致,因此付出一些额外的成本。
开源应用、开源库写法
与我们日常工作稍有不同的是:工作中的 Release 计划一般都是事先安排好的,不需要一些 CHANGELOG 什么的。而开源应用、开源库需要有对应的 CHANELOG,则添加了什么功能、修改了什么等等。毕竟有很多东西是由社区来维护的。
因此,这里以做得比较好的开源项目 Angular 中为例展示。Angular 团队建议采用以下的形式:
<type>(<scope>): <subject><BLANK LINE><body><BLANK LINE><footer>
诸如: docs(changelog): update change log to beta.5
中:
- docs 则对应修改的类型
- changelog 则是影响的范围
- subject 则是对应做的事件
对应的类型有:
- build: 影响构建系统或外部依赖关系的更改(示例范围:gulp,broccoli,npm)
- ci: 更改我们的持续集成文件和脚本(示例范围:Travis,Circle,BrowserStack,SauceLabs)
- docs: 仅文档更改
- feat: 一个新功能
- fix: 修复错误
- perf: 改进性能的代码更改
- refactor: 代码更改,既不修复错误也不添加功能
- style: 不影响代码含义的变化(空白,格式化,缺少分号等)
- test: 添加缺失测试或更正现有测试
同时还对应了 20+ 的 Scope,可以说这种提交比上面的提交更有挑战。
(以上的 10 个类型,感谢 Google Translate 提供的快速翻译支持)
而这样做的优点是,它可以轻松地生成一个 CHANGELOG,如下图所示:
Angular CHANGELOG 示例
与些同时还有一个名为 Conventional
Commits
的规范,建议采用相似的形式。
Git 工具推荐
至于我的日常用的 Git 观看工具,一个是 WebStorm 和 Intellij IDEA 自带的,一个则是 SourceTree。
由于日常用的开发工是 Intellij IDEA 企业版,所以就有点依赖于这个工具了。最常用的功能便是:修复 Bug 时,对于文件修改的追溯。了解某行代码修改的原因,对应的修改人等等。如下图所示:
IDEA 文件历史
而 SourceTree 则方便用来查看一些非我写的项目,寻找其中的一些问题。个中缘由便是:Intelli IDEA 刚打开某个项目的时候,需要花费大量的时间 index,只可惜现有的 SourceTree 客户端都需要登录 Atlassian 账户了。
- PhalApi-APK--APK文件解包处理
- [喵咪PHP]页面显示空白问题
- 数据库中间件 Sharding-JDBC 源码分析 —— 结果归并
- PhalGo-Request
- PhalApi-Excel
- PhalGo-Viper获取配置
- Dubbo 源码解析 —— 集群容错架构设计
- PhalGo-ADM思想
- 数据库中间件 Sharding-JDBC 源码分析 —— JDBC实现与读写分离
- Pytorch 0.3.0 发布:新增张量函数,支持模型移植
- 数据库分库分表中间件 Sharding-JDBC 源码分析 —— SQL 执行
- PhalGo-初识PhalGO
- 【学术】如何在神经网络中选择正确的激活函数
- PhalGo-Echo路由
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 「Elasticsearch + Lucene」搜索引擎的架构、倒排索引和搜索过程
- 查看 MAC JDK默认安装路径 JAVA路径 的shell 命令
- Gradle 命令行介紹和安裝教程
- Spring工厂创建复杂对象
- Nginx反向代理配置去除前缀
- 深入浅出java虚拟机
- Maven resources 分环境
- JetBrains Upsource(上源) 研究
- Spring JPA 拓展
- python自学成才之路 死锁的解决方案
- C++核心准则T.40: 使用函数对象向算法传递操作
- web页面性能优化总结及原理解释
- C++核心准则T.41:在模板概念中只对本质属性定义需求
- Linux实用技巧——mail发送邮件命令以及中文乱码解决
- Julia机器学习实战——使用Random Forest随机森林进行字符图像识别