约定式提交规范[v1.0.0],git 提交时 commit 信息应该怎么写

官网:https://www.conventionalcommits.org/

约定式提交 1.0.0

概述

约定式提交规范是一种基于提交信息的轻量级约定。
它提供了一组简单规则来创建清晰的提交历史;
这更有利于编写自动化工具。
通过在提交信息中描述功能、修复和破坏性变更,
使这种惯例与 SemVer 相互对应。

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


原文:

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

译文:

<类型>[可选 范围]: <描述>

[可选 正文]

[可选 脚注]

<br />
提交说明包含了下面的结构化元素,以向类库使用者表明其意图:

  1. fix: 类型fix 的提交表示在代码库中修复了一个 bug(这和语义化版本中的 PATCH 相对应)。
  2. feat: 类型feat 的提交表示在代码库中新增了一个功能(这和语义化版本中的 MINOR 相对应)。
  3. BREAKING CHANGE: 在脚注中包含 BREAKING CHANGE: 或 <类型>(范围) 后面有一个 ! 的提交,表示引入了破坏性 API 变更(这和语义化版本中的 MAJOR 相对应)。
    破坏性变更可以是任意 类型 提交的一部分。
  4. fix:feat: 之外,也可以使用其它提交 类型 ,例如 @commitlint/config-conventional(基于 Angular 约定)中推荐的 build:chore:
    ci:docs:style:refactor:perf:test:,等等。
  5. 脚注中除了 BREAKING CHANGE: <description> ,其它条目应该采用类似
    git trailer format 这样的惯例。

其它提交类型在约定式提交规范中并没有强制限制,并且在语义化版本中没有隐式影响(除非它们包含 BREAKING CHANGE)。
<br /><br />
可以为提交类型添加一个围在圆括号内的范围,以为其提供额外的上下文信息。例如 feat(parser): adds ability to parse arrays.

示例

包含了描述并且脚注中有破坏性变更的提交说明

feat: allow provided config object to extend other configs

BREAKING CHANGE: `extends` key in config file is now used for extending other config files

包含了 ! 字符以提醒注意破坏性变更的提交说明

refactor!: drop support for Node 6

包含了 ! 和 BREAKING CHANGE 脚注的提交说明

refactor!: drop support for Node 6

BREAKING CHANGE: refactor to use JavaScript features not available in Node 6.

不包含正文的提交说明

docs: correct spelling of CHANGELOG

包含范围的提交说明

feat(lang): add polish language

包含多行正文和多行脚注的提交说明

fix: correct minor typos in code

see the issue for details

on typos fixed.

Reviewed-by: Z
Refs #133

约定式提交规范

本文中的关键词 “必须(MUST)”、“禁止(MUST NOT)”、“必要(REQUIRED)”、“应当(SHALL)”、“不应当(SHALL NOT)”、“应该(SHOULD)”、“不应该(SHOULD NOT)”、“推荐(RECOMMENDED)”、“可以(MAY)” 和 “可选(OPTIONAL)” ,其相关解释参考 RFC 2119

  1. 每个提交都必须使用类型字段前缀,它由一个名词构成,诸如 featfix
    其后接可选的范围字段,可选的 !,以及必要的冒号(英文半角)和空格。
  2. 当一个提交为应用或类库实现了新功能时,必须使用 feat 类型。
  3. 当一个提交为应用修复了 bug 时,必须使用 fix 类型。
  4. 范围字段可以跟随在类型字段后面。范围必须是一个描述某部分代码的名词,并用圆括号包围,例如: fix(parser):
  5. 描述字段必须直接跟在 <类型>(范围) 前缀的冒号和空格之后。
    描述指的是对代码变更的简短总结,例如: fix: array parsing issue when multiple spaces were contained in string
  6. 在简短描述之后,可以编写较长的提交正文,为代码变更提供额外的上下文信息。正文必须起始于描述字段结束的一个空行后。
  7. 提交的正文内容自由编写,并可以使用空行分隔不同段落。
  8. 在正文结束的一个空行之后,可以编写一行或多行脚注。每行脚注都必须包含
    一个令牌(token),后面紧跟 :<space><space># 作为分隔符,后面再紧跟令牌的值(受
    git trailer convention 启发)。
  9. 脚注的令牌必须使用 - 作为连字符,比如 Acked-by (这样有助于
    区分脚注和多行正文)。有一种例外情况就是 BREAKING CHANGE,它可以被认为是一个令牌。
  10. 脚注的值可以包含空格和换行,值的解析过程必须直到下一个脚注的令牌/分隔符出现为止。
  11. 破坏性变更必须在提交信息中标记出来,要么在 <类型>(范围) 前缀中标记,要么作为脚注的一项。
  12. 包含在脚注中时,破坏性变更必须包含大写的文本 BREAKING CHANGE,后面紧跟着冒号、空格,然后是描述,例如:
    BREAKING CHANGE: environment variables now take precedence over config files
  13. 包含在 <类型>(范围) 前缀时,破坏性变更必须通过把 ! 直接放在 : 前面标记出来。
    如果使用了 !,那么脚注中可以不写 BREAKING CHANGE:
    同时提交信息的描述中应该用来描述破坏性变更。
  14. 在提交说明中,可以使用 featfix 之外的类型,比如:docs: updated ref docs.
  15. 工具的实现必须不区分大小写地解析构成约定式提交的信息单元,只有 BREAKING CHANGE 必须是大写的。
  16. BREAKING-CHANGE 作为脚注的令牌时必须是 BREAKING CHANGE 的同义词。

为什么使用约定式提交

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

FAQ

在初始开发阶段我该如何处理提交说明?

我们建议你按照假设你已发布了产品那样来处理。因为通常总 有人 使用你的软件,即便那是你软件开发的同事们。他们会希望知道诸如修复了什么、哪里不兼容等信息。

提交标题中的类型是大写还是小写?

大小写都可以,但最好是一致的。

如果提交符合多种类型我该如何操作?

回退并尽可能创建多次提交。约定式提交的好处之一是能够促使我们做出更有组织的提交和 PR。

这不会阻碍快速开发和迭代吗?

它阻碍的是以杂乱无章的方式快速前进。它助你能在横跨多个项目以及和多个贡献者协作时长期地快速演进。

约定式提交会让开发者受限于提交的类型吗(因为他们会想着已提供的类型)?

约定式提交鼓励我们更多地使用某些类型的提交,比如 fixes。除此之外,约定式提交的灵活性也允许你的团队使用自己的类型,并随着时间的推移更改这些类型。

这和 SemVer 有什么关联呢?

fix 类型提交应当对应到 PATCH 版本。feat 类型提交应该对应到 MINOR 版本。带有 BREAKING CHANGE 的提交不管类型如何,都应该对应到 MAJOR 版本。

我对约定式提交做了形如 @jameswomack/conventional-commit-spec 的扩展,该如何版本化管理这些扩展呢?

我们推荐使用 SemVer 来发布你对于这个规范的扩展(并鼓励你创建这些扩展!)

如果我不小心使用了错误的提交类型,该怎么办呢?

当你使用了在规范中但错误的类型时,例如将 feat 写成了 fix

在合并或发布这个错误之前,我们建议使用 git rebase -i 来编辑提交历史。而在发布之后,根据你使用的工具和流程不同,会有不同的清理方案。

当使用了 不在 规范中的类型时,例如将 feat 写成了 feet

在最坏的场景下,即便提交没有满足约定式提交的规范,也不会是世界末日。这只意味着这个提交会被基于规范的工具错过而已。

所有的贡献者都需要使用约定式提交规范吗?

并不!如果你使用基于 squash 的 Git 工作流,主管维护者可以在合并时清理提交信息——这不会对普通提交者产生额外的负担。
有种常见的工作流是让 git 系统自动从 pull request 中 squash 出提交,并向主管维护者提供一份表单,用以在合并时输入合适的 git 提交信息。

约定式提交规范中如何处理还原(revert)提交?

还原提交(Reverting)会比较复杂:你还原的是多个提交吗?如果你还原了一个功能模块,下次发布的应该是补丁吗?

约定式提交不能明确的定义还原行为。所以我们把这个问题留给工具开发者,
基于 类型脚注 的灵活性来开发他们自己的还原处理逻辑。

一种建议是使用 revert 类型,和一个指向被还原提交摘要的脚注:

revert: let us never again speak of the noodle incident

Refs: 676104e, a215868

关于

约定式提交规范受到了 Angular 提交准则的启发,并在很大程度上以其为依据。

该规范的首个草案来自下面这些项目中若干贡献者们的协作:

  • conventional-changelog:一套从 git 历史中解析出约定式提交说明的工具。
  • parse-commit-message:用于转换、字符串化、校验约定式提交信息的扩展工具。
  • bumped:一个用于发布软件的工具,可以在为你的软件发布新版本前后轻松地执行操作。
  • unleash:一个用于自动化软件发行和发布生命周期的工具。
  • lerna:一个用于管理宏仓库(monorepo)的工具,源自 Babel 项目。

用于约定式提交的工具

  • fastlane-plugin: 根据规范管理版本并自动生成变更日志。
  • commitizen/cz-cli: Node.js 工具,用于创建遵循约定式提交规范的提交信息。
  • commitizen-tools/commitizen: Python 编写的项目提交规则创建工具,自动增加版本号并生成变更记录。
  • php-commitizen: PHP工具,用于创建遵循约定式提交规范的提交信息。
    可配置,并且可以作为 composer 依赖项用于 PHP 项目,或可在非 PHP 项目中全局使用。
  • commitlint: 用于检查提交信息是否符合约定式提交规范的检查器。
  • gitlint: Python 开发的 Git 提交信息检查器,可以通过 enforce Conventional Commits format 进行配置。
  • conform: 一个可用以在 git 仓库上施加配置的工具,包括约定式提交。
  • detect-next-version: 对约定式提交规范的内容进行解析、检测并提取出元信息。
  • recommended-bump: 根据约定式提交的信息计算并推荐新版本号。
  • git-commits-since: 获取一个周期内或上一个语义化版本到现在的所有原始提交信息,支持自定义插件。
  • standard-version: 自动化的版本和 CHANGELOG 管理。使用 GitHub 新的合并提交按钮,并推荐使用约定式提交工作流。
  • Conventional Commit: 在版本控制系统的提交窗口中提供可扩展的约定式提交规范模板,可以用于所有 JetBrains IDEs
  • Git Commit Template: 在 JetBrains Editors (IntelliJ IDEA, PyCharm, PhpStorm...) 中增加约定式提交规范的支持。
  • commitsar: Go 工具,用于检查分支上的提交信息是否符合约定式提交规范,并提供了 Docker 镜像给 CI 用户使用。
  • semantic-release: 一个自动化整个项目的工具,包括:决定下一个版本号,生成发布说明并发布项目包。
  • python-semantic-release: 为 Python 项目提供自动化语义版本。这是一个 Python 版本的 semantic-release
  • VSCode Conventional Commits: 为 VSCode 添加约定式提交规范的支持。
  • Pyhist: Python 工具,根据 git 历史记录自动更新包版本并生成变更日志。
  • git-mkver: 根据 Conventional Commits 在 git 项目中自动实现语义化版本的工具。
  • Conventional Commits Next Version: 跨语言工具,从最近的一个版本开始,根据符合 Conventional Commits 的提交信息,计算下一个语义化版本。

使用约定式提交的项目

  • yargs:广受欢迎的命令行参数解析器。
  • istanbuljs:一套为 JavaScript 测试生成测试覆盖率的开源工具和类库。
  • uPortal-homeuPortal-application-framework:用于增强 Apereo uPortal 的可选用户界面。
  • massive.js:一个用于 Node 和 PostgreSQL 的数据访问类库。
  • electron:用 JavaScript、HTML 和 CSS 构建跨平台应用。
  • scroll-utility:一个居中元素和平滑动画的滚屏工具包实例。
  • Blaze UI:无框架开源 UI 套件。
  • Monica:一个开源的人际关系管理系统。
  • mhy:一个零配置、开箱即用的、多用途工具箱与开发环境。
  • @tandil/diffparse: 简单的 Diff 文件解析器(统一 diff 格式)。
  • @tandil/diffsplit: 快速将 .diff 和 .patch 拆分成独立文件。
  • @thi.ng/umbrella: 数据驱动开发的 ~100 个 TypeScript 项目。
  • yii2-basic-firestarter: 🔥 Yii2应用的增强模板。
  • dcyou/resume: 😎 快速创建在线简历的模板。
  • Nintex Forms: 方便的创建动态在线表单并获准确、实时数据。
  • Tina CMS: 为你的网站创建前端内容管理的开源工具集。
  • Uno Platform: 使用 C# 和 XAML 创建移动、桌面和 WebAssembly 应用。今天,开源并给予专业支持。

[图片上传失败...(image-31f075-1605002713878)]

想让你的项目出现在上面吗? 提交 pull request 吧。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 157,298评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,701评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,078评论 0 237
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,687评论 0 202
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,018评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,410评论 1 211
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,729评论 2 310
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,412评论 0 194
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,124评论 1 239
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,379评论 2 242
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,903评论 1 257
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,268评论 2 251
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,894评论 3 233
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,014评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,770评论 0 192
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,435评论 2 269
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,312评论 2 260

推荐阅读更多精彩内容