首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >一文搞定 Conventional Commits

一文搞定 Conventional Commits

作者头像
用户1250838
发布于 2021-07-30 03:10:37
发布于 2021-07-30 03:10:37
1.8K0
举报
文章被收录于专栏:洛竹早茶馆洛竹早茶馆

大家好,我是洛竹?,一只住在杭城的木系前端??‍♀️,如果你喜欢我的文章?,可以通过点赞帮我聚集灵力⭐️。

本文的最佳实践已编写为 cli 工具,npm install -g @youngjuning/cli 并执行 youngjuning init-commitlint 即可获取

前言

规范化 git commit 对于提高 git log 可读性、可控的版本控制和 changelog 生成都有着重要的作用。然而阻碍我们脚步的不只是团队的推广,单单对于一系列工具的配置都让人头大。这其中主要就是 commitlint 和 commitizen 的配合使用以及自定义提交规范。本文总结了目前的最佳实践给大家,如果有帮助,赏个star足矣。

Conventional Commits 约定式提交规范

Conventional Commits 是一种用于给提交信息增加人机可读含义的规范。约定式提交规范是一种基于消息的轻量级约定。它提供了一组用于创建清晰的提交历史的简单规则;这使得编写基于规范的自动化工具变得更容易。这个约定与 SemVer 相吻合,在提交信息中描述新特性、bug 修复和破坏性变更。

提交说明的结构如下所示:

代码语言:javascript
AI代码解释
复制
<类型>([可选的作用域]): <描述>

[可选的正文]

[可选的脚注]

类型(type)

  • feat:: 类型为 feat 的提交表示在代码库中新增了一个功能(这和语义化版本中的 MINOR 相对应)。
  • fix::类型为 fix 的 提交表示在代码库中修复了一个 bug (这和语义化版本中的 PATCH 相对应)。
  • docs:: 只是更改文档。
  • style:: 不影响代码含义的变化(空白、格式化、缺少分号等)。
  • refactor:: 代码重构,既不修复错误也不添加功能。
  • perf:: 改进性能的代码更改。
  • test:: 添加确实测试或更正现有的测试。
  • build:: 影响构建系统或外部依赖关系的更改(示例范围:gulp、broccoli、NPM)。
  • ci:: 更改持续集成文件和脚本(示例范围:Travis、Circle、BrowserStack、SauceLabs)。
  • chore:: 其他不修改srctest文件。
  • revert:: commit 回退。

范围(scope)

可以为提交类型添加一个围在圆括号内的作用域,以为其提供额外的上下文信息。例如 feat(parser): adds ability to parse arrays.

BREAKING CHANGE

在可选的正文或脚注的起始位置带有 BREAKING CHANGE: 的提交,表示引入了破坏性 API 变更(这和语义化版本中的 MAJOR 相对应)。破坏性变更可以是任意 类型 提交的一部分。

示例

包含了描述以及正文内有破坏性变更的提交说明
代码语言:javascript
AI代码解释
复制
feat: allow provided config object to extend other configs

BREAKING CHANGE: `extends` key in config file is now used for extending other config files
包含了可选的 ! 字符以提醒注意破坏性变更的提交说明
代码语言:javascript
AI代码解释
复制
chore!: drop Node 6 from testing matrix

BREAKING CHANGE: dropping Node 6 which hits end of life in April
不包含正文的提交说明
代码语言:javascript
AI代码解释
复制
docs: correct spelling of CHANGELOG
包含作用域的提交说明
代码语言:javascript
AI代码解释
复制
feat(lang): add polish language
为 fix 编写的提交说明,包含(可选的) issue 编号
代码语言:javascript
AI代码解释
复制
fix: correct minor typos in code

see the issue for details on the typos fixed

closes issue #12

约定式提交规范

  1. 每个提交都「必须」使用类型字段前缀,它由一个名词组成,诸如featfix,其后接一个「可选的」作用域字段,以及一个「必要的」冒号(英文半角)和空格。
  2. 当一个提交为应用或类库实现了新特性时,「必须」使用feat类型。
  3. 当一个提交为应用修复 bug 时,「必须」使用fix类型。
  4. 作用域字段可以跟随在类型字段后面。作用有「必须」是一个描述某部分代码的名词,并用圆括号包围,例如:fix(parser):
  5. 描述字段「必须」紧接在类型/作用域前缀的空格之后。描述指的是对代码变更的简短总结,例如:fix:array parsing issue when multiplejspaces were contained in string
  6. 在简短描述之后,「可以」编写更长的提交正文,为代码变更提供额外的上下文信息。正文「必须」起始于描述字段结束的一个空行后。
  7. 在正文结束的一个空行之后,「可以」编写一行或或多行脚注。脚注「必须」包含关于提交的元信息,例如:关联的合并请求、Reviewer、破坏性变更、每条元信息一行。
  8. 破坏性变更「必须」标示在正文区域最开始处,或脚注区域中某一行的开始。一个破坏性变更「必须」包含大写的文本BREAKING CHANGE,后面紧跟冒号和空格。
  9. BREAKING CHANGE:之后「必须」提供描述,以描述对 API 的变更。例如:BREAKING CHANGE: enviroment variables now take precedence over cofig files
  10. 在提交说明中,「可以」使用featfix之外的类型。
  11. 工具的实现「必须不」区分大小写地解析构成约定式提交的信息单元,只有BREAKING CHANGE 「必须」是大写的。
  12. 「可以」在类型/作用域前缀之后,:之前,附加!字符,以进一步提醒注意破坏性变更。当有!前缀时,正文或脚注内必须包含BREAKING CHANGE: description

为什么使用约定式提交

  • 自动化生产 CHANGELOG。
  • 基于提交的类型,自动决定语义化的版本变更。
  • 向同事、公众与其他利益关系者传达变化的性质。
  • 触发构建和部署流程。
  • 让人们探索一个更加结构化的提交历史,以便降低对你的项目作出贡献的难度。

cz-customizable

可自定义的Commitizen插件(或独立实用运行)可帮助实现一致的提交消息。

安装 commitizen、cz-customizable:

代码语言:javascript
AI代码解释
复制
$ yarn add -D commitizen cz-customizable

向 package.json 添加新的 script:

代码语言:javascript
AI代码解释
复制
{
  "scripts" : {
    ...
    "commit": "git cz"
  }
  "config": {
    "commitizen": {
      "path": "cz-customizable"
    }
  }
}

在根目录新建 .cz-config.js 并复制 cz-config-EXAMPLE.js 到文件。

效果:

commitlint

commitlint检查您的提交消息是否符合conventional commit format。

1、安装 @commitlint/cli、husky:

代码语言:javascript
AI代码解释
复制
$ yarn add -D @commitlint/cli husky

2、添加 git commit hooks 到 package.json:

代码语言:javascript
AI代码解释
复制
{
  ...
  "husky": {
    "hooks": {
      "commit-msg": "commitlint -E HUSKY_GIT_PARAMS"
    }
  }
}

3、安装 commitlint-config-cz:

commitlint-config-cz 合并 cz-customizable 的配置 {types,scopes,scopeOverrides} 和 commitlint 的配置 {type-enum,scope-enum}。这样,你就可以在一个地方维护 types 和 scopes。

代码语言:javascript
AI代码解释
复制
$ yarn add commitlint-config-cz -D

4、在 commitlint.config.js 中用 cz 扩展您的 commitlint 配置:

代码语言:javascript
AI代码解释
复制
module.exports = {
  extends: ['cz'],
  rules: {
    // must add these rules
    'type-empty': [2, 'never'],
    'subject-empty': [2, 'never']
  }
};

vscode commitizen

在 VS Code 中搜索装 vscode commitizen,然后就可以摆脱命令行了,而且这个插件是和前面所有的配置兼容的,效果如下:

GitHub Actions

新建一个 github workflow .github/workflows/commitlint.yml,作用是在提交 pull_request 时,检查信息:

代码语言:javascript
AI代码解释
复制
name: Lint Commit Messages
on: [pull_request]

jobs:
  commitlint:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0
      - uses: actions/setup-node@v1
        with:
          node-version: '10.x'
      - run: npm install
      - name: Add dependencies for commitlint action
        # $GITHUB_WORKSPACE is the path to your repository
        run: echo "::set-env name=NODE_PATH::$GITHUB_WORKSPACE/node_modules"
      # Now the commitlint action will run considering its own dependencies and yours as well ?
      - uses: wagoid/commitlint-github-action@v2

standard-version

standard-version 是一款遵循语义化版本( semver)和 commit message 标准规范 的版本和 changelog 自动化工具。通常情况线下,我们会在 master 分支进行如下的版本发布操作:

  1. git pull origin master
  2. 根据 package.json 中的 version 更新版本号,更新 CHANGELOG
  3. git add .
  4. git commit
  5. git tag 打版本操作
  6. git push --tags:push 版本 tag 和 master 分支到仓库

其中 「2,3,4,5」 是 standard-version 工具会自动完成的工作,配合本地的 shell 脚本,则可以自动完成一系列版本发布的工作了。

安装 & 使用

代码语言:javascript
AI代码解释
复制
$ yarn add -D standard-version
代码语言:javascript
AI代码解释
复制
// package.json
{
  "scripts": {
    "release": "standard-version"
  }
}
  • First Release:yarn release --first-release
  • Cutting Release:yarn release
  • Release as a Pre-Release:yarn release --prerelease or yarn release --prerelease alpha
  • Release as a Target Type Imperatively (npm version-like):yarn release --release-as minor or yarn release --release-as 1.1.0,可以合并 --prerelease以此方便发布实验性特性
  • Prevent Git Hooks:yarn release --no-verify

关注公众号洛竹早茶馆,一个持续分享编程知识的地方。

  • 点赞等于学会,在看等于精通
  • 最后祝大家 2021 学习进步,升职加薪

本文首发于「洛竹的官方网站」,同步于公众号「洛竹早茶馆」和「掘金专栏」。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-07-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 洛竹早茶馆 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
别乱提交代码了,看下大厂 Git 提交规范是怎么做的!
现在市面上比较流行的方案是约定式提交规范(Conventional Commits),它受到了Angular提交准则的启发,并在很大程度上以其为依据。约定式提交规范是一种基于提交消息的轻量级约定。它提供了一组用于创建清晰的提交历史的简单规则;这使得编写基于规范的自动化工具变得更容易。这个约定与SemVer相吻合,在提交信息中描述新特性、bug 修复和破坏性变更。它的 message 格式如下:
Erwin
2020/02/11
1.2K0
别乱提交代码了,看下大厂 Git 提交规范是怎么做的
现在市面上比较流行的方案是约定式提交规范(Conventional Commits),它受到了Angular提交准则的启发,并在很大程度上以其为依据。约定式提交规范是一种基于提交消息的轻量级约定。
IT大咖说
2020/02/21
3K0
别乱提交代码了,看下大厂 Git 提交规范是怎么做的
如何优雅的编写git的提交信息
在公司的日常工作当中或者个人的开源项目,将代码提交到代码库时。都会遇到下面这样的对话框,通常都会随便写点内容在里面。
JusterZhu
2022/12/07
7900
如何优雅的编写git的提交信息
别乱提交代码了,看下大厂 Git 提交规范是怎么做的!
现在市面上比较流行的方案是约定式提交规范(Conventional Commits),它受到了Angular提交准则的启发,并在很大程度上以其为依据。约定式提交规范是一种基于提交消息的轻量级约定。它提供了一组用于创建清晰的提交历史的简单规则;这使得编写基于规范的自动化工具变得更容易。这个约定与SemVer相吻合,在提交信息中描述新特性、bug 修复和破坏性变更。它的 message 格式如下:
芋道源码
2020/02/10
1.3K0
编写优雅的 commit message 并自动生成 changelog
http://www.ruanyifeng.com/blog/2016/01/commit_message_change_log.html
木子星兮
2020/09/07
2.7K1
编写优雅的 commit message 并自动生成 changelog
测试开发必学技能之一:代码提交规范与自动生成工具!
约定式提交(Conventional Commits)是一种用于代码版本控制的规范,旨在通过明确和标准化提交信息来提高代码协作质量和效率。其基本原则是通过规定提交信息的结构和语义来提高代码版本控制的可读性、可维护性和自动化程度。
测试开发技术
2024/12/23
3410
测试开发必学技能之一:代码提交规范与自动生成工具!
【Git】:Commit规范 + CHANGELOG生成
从 git commit 的 message 开始进行规范化(主流:angular 规范),进而可以通过工具(例如:conventional-changelog)把关键信息找出来,并自动生成到 CHANGELOG 中。
WEBJ2EE
2020/12/02
5.2K0
【Git】:Commit规范 + CHANGELOG生成
前端规范指南,让团队代码如出一辙!ESLint + Prettier + husky + lint-staged
假如团队中的小伙伴在提交代码时没有遵循规范要求,例如只写了一个"修改"或"更新,这会给团队中其他小伙伴造成困扰呢,不得不花时间查看代码和推测逻辑。
程序员王天
2023/10/18
3.6K0
前端规范指南,让团队代码如出一辙!ESLint + Prettier + husky + lint-staged
git commit 规范及自动化
白墨石
2023/10/07
6940
如何规范开发一个vue项目
在软件开发的浩渺星海中,编程规范如同航海的罗盘,为我们指引方向,确保我们的代码之旅能够顺利、高效地到达目的地。无论是个人开发者还是大型团队,编程规范都是提升代码质量、保障项目成功不可或缺的一环。
炑焽
2024/09/07
9070
Git Commit Message 最佳实践
Git 是一个免费开源的分布式版本控制系统,由 Linux 之父 Linus Torvalds 于 2005 年开发,最初的目的用于管理 Linux 内核的开发。
恋喵大鲤鱼
2023/10/12
1.1K0
Git Commit Message 最佳实践
Git Message 编写规范
scope 用于说明 commit 影响的范围,比如数据层、控制层、视图层等等,视项目不同而不同
用户10125653
2022/11/10
8680
让你的 commit 更有价值
AngularJS 在开发者文档1中关于 git commit 的指导说明,提到严格的 git commit 格式规范可以在浏览项目历史的过程中看到更易读的信息,并且能用 git commit 的信息直接生成 AngularJS 的 change log 。
陈大鱼头
2021/01/18
1.3K0
让你的 commit 更有价值
pnpm + workspace + changesets 构建你的 monorepo 工
关于这些问题,在之前的一篇介绍 lerna 的文章中已经详细介绍过,感兴趣的同学可以再回顾下。
astonishqft
2022/08/31
5.7K0
pnpm + workspace + changesets 构建你的 monorepo 工
Angular 工具篇之规范化Git版本管理
目前很多的项目都已经使用 Git 作为版本控制工具,使用 Git 意味着我们每天都要与 Git Commit Message 打交道。Git Commit Message 看似简单,但实际却很重要。通过 Git Commit Message 我们可以快速地了解本次提交的信息,比如解决了哪个 Bug、优化了什么问题或新增了什么功能等。
阿宝哥
2019/11/05
1.6K0
git commit规范化实践
最近从svn转到git进行代码版本控制,今天了解了git commit规范化的一些知识后,写此文章记录下配置过程。
寻找石头鱼
2019/08/20
1.4K0
git commit规范化实践
巧用 gitHooks 提交前校验代码
在每一个使用 git 进行版本管理的仓库,都有一个目录 .git/hooks,包含 commit 各个阶段 Hooks 的脚本。这些 Hooks 在 git 操作 commit、push、merge 等得时候,可以做前置或者后置的操作,例如 pre-commit 在 git commit 前可以做代码校验,校验代码的时候使用的ESLint,格式化使用的是 prettier。Git 支持的常用钩子见下表,更多请查看官网Hooks:
刘小夕
2021/12/09
5.1K0
巧用 gitHooks 提交前校验代码
你可能已经忽略的git commit规范
在日常的开发工作中,我们通常使用 git 来管理代码,当我们对代码进行某项改动后,都可以通过 git commit 来对代码进行提交。
前端森林
2020/04/23
3.3K0
你可能已经忽略的git commit规范
前端规范落地,团队级的解决方案
本文主要讲前端开发时遇到的 编码规范难以落地的问题 以及 解决方案 ,包括 编码规范 和 git commit 规范。
德育处主任
2022/04/17
9690
前端规范落地,团队级的解决方案
【打造前端现代化规范工程】Vite + ESLint + Husky + Commitlint + Lint-staged
本文虽然使用 Vite 创建了一个 Vue3 + TS 的项目,但其实文中涉及的内容和技术栈并没有关系,主要是结合 ESLint ,Husky,等第三方库实现比较规范的现代化前端工程,可应用于任何技术栈的项目中
一尾流莺
2023/04/23
1.6K0
【打造前端现代化规范工程】Vite + ESLint + Husky + Commitlint + Lint-staged
推荐阅读
相关推荐
别乱提交代码了,看下大厂 Git 提交规范是怎么做的!
更多 >
交个朋友
加入腾讯云官网粉丝站
双11活动抢先看 更有社群专属礼券掉落
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
首页
学习
活动
专区
圈层
工具
MCP广场
首页
学习
活动
专区
圈层
工具
MCP广场