約定式提交規(guī)范[v1.0.0]懒熙,git 提交時(shí) commit 信息應(yīng)該怎么寫

官網(wǎng):https://www.conventionalcommits.org/

約定式提交 1.0.0

概述

約定式提交規(guī)范是一種基于提交信息的輕量級(jí)約定。
它提供了一組簡(jiǎn)單規(guī)則來創(chuàng)建清晰的提交歷史野崇;
這更有利于編寫自動(dòng)化工具嚼松。
通過在提交信息中描述功能又憨、修復(fù)和破壞性變更虾啦,
使這種慣例與 SemVer 相互對(duì)應(yīng)麻诀。

提交說明的結(jié)構(gòu)如下所示:


原文:

<type>[optional scope]: <description>

[optional body]

[optional footer(s)]

譯文:

<類型>[可選 范圍]: <描述>

[可選 正文]

[可選 腳注]

<br />
提交說明包含了下面的結(jié)構(gòu)化元素,以向類庫(kù)使用者表明其意圖:

  1. fix: 類型fix 的提交表示在代碼庫(kù)中修復(fù)了一個(gè) bug(這和語義化版本中的 PATCH 相對(duì)應(yīng))傲醉。
  2. feat: 類型feat 的提交表示在代碼庫(kù)中新增了一個(gè)功能(這和語義化版本中的 MINOR 相對(duì)應(yīng))蝇闭。
  3. BREAKING CHANGE: 在腳注中包含 BREAKING CHANGE: 或 <類型>(范圍) 后面有一個(gè) ! 的提交,表示引入了破壞性 API 變更(這和語義化版本中的 MAJOR 相對(duì)應(yīng))需频。
    破壞性變更可以是任意 類型 提交的一部分丁眼。
  4. fix:feat: 之外筷凤,也可以使用其它提交 類型 昭殉,例如 @commitlint/config-conventional(基于 Angular 約定)中推薦的 build:chore:藐守、
    ci:挪丢、docs:style:卢厂、refactor:乾蓬、perf:test:慎恒,等等任内。
  5. 腳注中除了 BREAKING CHANGE: <description> ,其它條目應(yīng)該采用類似
    git trailer format 這樣的慣例融柬。

其它提交類型在約定式提交規(guī)范中并沒有強(qiáng)制限制死嗦,并且在語義化版本中沒有隱式影響(除非它們包含 BREAKING CHANGE)。
<br /><br />
可以為提交類型添加一個(gè)圍在圓括號(hào)內(nèi)的范圍粒氧,以為其提供額外的上下文信息越除。例如 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

約定式提交規(guī)范

本文中的關(guān)鍵詞 “必須(MUST)”外盯、“禁止(MUST NOT)”摘盆、“必要(REQUIRED)”、“應(yīng)當(dāng)(SHALL)”饱苟、“不應(yīng)當(dāng)(SHALL NOT)”孩擂、“應(yīng)該(SHOULD)”、“不應(yīng)該(SHOULD NOT)”箱熬、“推薦(RECOMMENDED)”类垦、“可以(MAY)” 和 “可選(OPTIONAL)” 囤锉,其相關(guān)解釋參考 RFC 2119

  1. 每個(gè)提交都必須使用類型字段前綴护锤,它由一個(gè)名詞構(gòu)成官地,諸如 featfix
    其后接可選的范圍字段烙懦,可選的 !驱入,以及必要的冒號(hào)(英文半角)和空格。
  2. 當(dāng)一個(gè)提交為應(yīng)用或類庫(kù)實(shí)現(xiàn)了新功能時(shí)氯析,必須使用 feat 類型亏较。
  3. 當(dāng)一個(gè)提交為應(yīng)用修復(fù)了 bug 時(shí),必須使用 fix 類型掩缓。
  4. 范圍字段可以跟隨在類型字段后面雪情。范圍必須是一個(gè)描述某部分代碼的名詞,并用圓括號(hào)包圍你辣,例如: fix(parser):
  5. 描述字段必須直接跟在 <類型>(范圍) 前綴的冒號(hào)和空格之后巡通。
    描述指的是對(duì)代碼變更的簡(jiǎn)短總結(jié),例如: fix: array parsing issue when multiple spaces were contained in string 舍哄。
  6. 在簡(jiǎn)短描述之后宴凉,可以編寫較長(zhǎng)的提交正文,為代碼變更提供額外的上下文信息表悬。正文必須起始于描述字段結(jié)束的一個(gè)空行后弥锄。
  7. 提交的正文內(nèi)容自由編寫,并可以使用空行分隔不同段落蟆沫。
  8. 在正文結(jié)束的一個(gè)空行之后籽暇,可以編寫一行或多行腳注。每行腳注都必須包含
    一個(gè)令牌(token)饭庞,后面緊跟 :<space><space># 作為分隔符戒悠,后面再緊跟令牌的值(受
    git trailer convention 啟發(fā))。
  9. 腳注的令牌必須使用 - 作為連字符但绕,比如 Acked-by (這樣有助于
    區(qū)分腳注和多行正文)救崔。有一種例外情況就是 BREAKING CHANGE,它可以被認(rèn)為是一個(gè)令牌捏顺。
  10. 腳注的值可以包含空格和換行六孵,值的解析過程必須直到下一個(gè)腳注的令牌/分隔符出現(xiàn)為止。
  11. 破壞性變更必須在提交信息中標(biāo)記出來幅骄,要么在 <類型>(范圍) 前綴中標(biāo)記劫窒,要么作為腳注的一項(xiàng)。
  12. 包含在腳注中時(shí)拆座,破壞性變更必須包含大寫的文本 BREAKING CHANGE主巍,后面緊跟著冒號(hào)冠息、空格,然后是描述孕索,例如:
    BREAKING CHANGE: environment variables now take precedence over config files 逛艰。
  13. 包含在 <類型>(范圍) 前綴時(shí),破壞性變更必須通過把 ! 直接放在 : 前面標(biāo)記出來搞旭。
    如果使用了 !散怖,那么腳注中可以不寫 BREAKING CHANGE:
    同時(shí)提交信息的描述中應(yīng)該用來描述破壞性變更肄渗。
  14. 在提交說明中镇眷,可以使用 featfix 之外的類型,比如:docs: updated ref docs. 翎嫡。
  15. 工具的實(shí)現(xiàn)必須不區(qū)分大小寫地解析構(gòu)成約定式提交的信息單元欠动,只有 BREAKING CHANGE 必須是大寫的。
  16. BREAKING-CHANGE 作為腳注的令牌時(shí)必須是 BREAKING CHANGE 的同義詞惑申。

為什么使用約定式提交

  • 自動(dòng)化生成 CHANGELOG具伍。
  • 基于提交的類型,自動(dòng)決定語義化的版本變更硝桩。
  • 向同事沿猜、公眾與其他利益關(guān)系者傳達(dá)變化的性質(zhì)枚荣。
  • 觸發(fā)構(gòu)建和部署流程碗脊。
  • 讓人們探索一個(gè)更加結(jié)構(gòu)化的提交歷史,以便降低對(duì)你的項(xiàng)目做出貢獻(xiàn)的難度橄妆。

FAQ

在初始開發(fā)階段我該如何處理提交說明衙伶?

我們建議你按照假設(shè)你已發(fā)布了產(chǎn)品那樣來處理。因?yàn)橥ǔ害碾??有人 使用你的軟件矢劲,即便那是你軟件開發(fā)的同事們。他們會(huì)希望知道諸如修復(fù)了什么慌随、哪里不兼容等信息芬沉。

提交標(biāo)題中的類型是大寫還是小寫?

大小寫都可以,但最好是一致的阁猜。

如果提交符合多種類型我該如何操作丸逸?

回退并盡可能創(chuàng)建多次提交。約定式提交的好處之一是能夠促使我們做出更有組織的提交和 PR剃袍。

這不會(huì)阻礙快速開發(fā)和迭代嗎黄刚?

它阻礙的是以雜亂無章的方式快速前進(jìn)。它助你能在橫跨多個(gè)項(xiàng)目以及和多個(gè)貢獻(xiàn)者協(xié)作時(shí)長(zhǎng)期地快速演進(jìn)民效。

約定式提交會(huì)讓開發(fā)者受限于提交的類型嗎(因?yàn)樗麄儠?huì)想著已提供的類型)憔维?

約定式提交鼓勵(lì)我們更多地使用某些類型的提交涛救,比如 fixes。除此之外业扒,約定式提交的靈活性也允許你的團(tuán)隊(duì)使用自己的類型检吆,并隨著時(shí)間的推移更改這些類型。

這和 SemVer 有什么關(guān)聯(lián)呢程储?

fix 類型提交應(yīng)當(dāng)對(duì)應(yīng)到 PATCH 版本咧栗。feat 類型提交應(yīng)該對(duì)應(yīng)到 MINOR 版本。帶有 BREAKING CHANGE 的提交不管類型如何虱肄,都應(yīng)該對(duì)應(yīng)到 MAJOR 版本致板。

我對(duì)約定式提交做了形如 @jameswomack/conventional-commit-spec 的擴(kuò)展,該如何版本化管理這些擴(kuò)展呢咏窿?

我們推薦使用 SemVer 來發(fā)布你對(duì)于這個(gè)規(guī)范的擴(kuò)展(并鼓勵(lì)你創(chuàng)建這些擴(kuò)展U寤颉)

如果我不小心使用了錯(cuò)誤的提交類型,該怎么辦呢集嵌?

當(dāng)你使用了在規(guī)范中但錯(cuò)誤的類型時(shí)萝挤,例如將 feat 寫成了 fix

在合并或發(fā)布這個(gè)錯(cuò)誤之前,我們建議使用 git rebase -i 來編輯提交歷史根欧。而在發(fā)布之后怜珍,根據(jù)你使用的工具和流程不同,會(huì)有不同的清理方案凤粗。

當(dāng)使用了 不在 規(guī)范中的類型時(shí)酥泛,例如將 feat 寫成了 feet

在最壞的場(chǎng)景下,即便提交沒有滿足約定式提交的規(guī)范嫌拣,也不會(huì)是世界末日柔袁。這只意味著這個(gè)提交會(huì)被基于規(guī)范的工具錯(cuò)過而已。

所有的貢獻(xiàn)者都需要使用約定式提交規(guī)范嗎异逐?

并不捶索!如果你使用基于 squash 的 Git 工作流,主管維護(hù)者可以在合并時(shí)清理提交信息——這不會(huì)對(duì)普通提交者產(chǎn)生額外的負(fù)擔(dān)灰瞻。
有種常見的工作流是讓 git 系統(tǒng)自動(dòng)從 pull request 中 squash 出提交腥例,并向主管維護(hù)者提供一份表單,用以在合并時(shí)輸入合適的 git 提交信息酝润。

約定式提交規(guī)范中如何處理還原(revert)提交?

還原提交(Reverting)會(huì)比較復(fù)雜:你還原的是多個(gè)提交嗎燎竖?如果你還原了一個(gè)功能模塊,下次發(fā)布的應(yīng)該是補(bǔ)丁嗎袍祖?

約定式提交不能明確的定義還原行為底瓣。所以我們把這個(gè)問題留給工具開發(fā)者,
基于 類型腳注 的靈活性來開發(fā)他們自己的還原處理邏輯。

一種建議是使用 revert 類型捐凭,和一個(gè)指向被還原提交摘要的腳注:

revert: let us never again speak of the noodle incident

Refs: 676104e, a215868

關(guān)于

約定式提交規(guī)范受到了 Angular 提交準(zhǔn)則的啟發(fā)拨扶,并在很大程度上以其為依據(jù)。

該規(guī)范的首個(gè)草案來自下面這些項(xiàng)目中若干貢獻(xiàn)者們的協(xié)作:

  • conventional-changelog:一套從 git 歷史中解析出約定式提交說明的工具茁肠。
  • parse-commit-message:用于轉(zhuǎn)換患民、字符串化、校驗(yàn)約定式提交信息的擴(kuò)展工具垦梆。
  • bumped:一個(gè)用于發(fā)布軟件的工具匹颤,可以在為你的軟件發(fā)布新版本前后輕松地執(zhí)行操作。
  • unleash:一個(gè)用于自動(dòng)化軟件發(fā)行和發(fā)布生命周期的工具托猩。
  • lerna:一個(gè)用于管理宏倉(cāng)庫(kù)(monorepo)的工具印蓖,源自 Babel 項(xiàng)目。

用于約定式提交的工具

  • fastlane-plugin: 根據(jù)規(guī)范管理版本并自動(dòng)生成變更日志京腥。
  • commitizen/cz-cli: Node.js 工具赦肃,用于創(chuàng)建遵循約定式提交規(guī)范的提交信息。
  • commitizen-tools/commitizen: Python 編寫的項(xiàng)目提交規(guī)則創(chuàng)建工具公浪,自動(dòng)增加版本號(hào)并生成變更記錄他宛。
  • php-commitizen: PHP工具,用于創(chuàng)建遵循約定式提交規(guī)范的提交信息欠气。
    可配置厅各,并且可以作為 composer 依賴項(xiàng)用于 PHP 項(xiàng)目,或可在非 PHP 項(xiàng)目中全局使用预柒。
  • commitlint: 用于檢查提交信息是否符合約定式提交規(guī)范的檢查器队塘。
  • gitlint: Python 開發(fā)的 Git 提交信息檢查器,可以通過 enforce Conventional Commits format 進(jìn)行配置卫旱。
  • conform: 一個(gè)可用以在 git 倉(cāng)庫(kù)上施加配置的工具人灼,包括約定式提交。
  • detect-next-version: 對(duì)約定式提交規(guī)范的內(nèi)容進(jìn)行解析顾翼、檢測(cè)并提取出元信息。
  • recommended-bump: 根據(jù)約定式提交的信息計(jì)算并推薦新版本號(hào)奈泪。
  • git-commits-since: 獲取一個(gè)周期內(nèi)或上一個(gè)語義化版本到現(xiàn)在的所有原始提交信息适贸,支持自定義插件。
  • standard-version: 自動(dòng)化的版本和 CHANGELOG 管理涝桅。使用 GitHub 新的合并提交按鈕拜姿,并推薦使用約定式提交工作流。
  • Conventional Commit: 在版本控制系統(tǒng)的提交窗口中提供可擴(kuò)展的約定式提交規(guī)范模板冯遂,可以用于所有 JetBrains IDEs蕊肥。
  • Git Commit Template: 在 JetBrains Editors (IntelliJ IDEA, PyCharm, PhpStorm...) 中增加約定式提交規(guī)范的支持。
  • commitsar: Go 工具,用于檢查分支上的提交信息是否符合約定式提交規(guī)范壁却,并提供了 Docker 鏡像給 CI 用戶使用批狱。
  • semantic-release: 一個(gè)自動(dòng)化整個(gè)項(xiàng)目的工具,包括:決定下一個(gè)版本號(hào)展东,生成發(fā)布說明并發(fā)布項(xiàng)目包赔硫。
  • python-semantic-release: 為 Python 項(xiàng)目提供自動(dòng)化語義版本。這是一個(gè) Python 版本的 semantic-release盐肃。
  • VSCode Conventional Commits: 為 VSCode 添加約定式提交規(guī)范的支持爪膊。
  • Pyhist: Python 工具,根據(jù) git 歷史記錄自動(dòng)更新包版本并生成變更日志砸王。
  • git-mkver: 根據(jù) Conventional Commits 在 git 項(xiàng)目中自動(dòng)實(shí)現(xiàn)語義化版本的工具推盛。
  • Conventional Commits Next Version: 跨語言工具,從最近的一個(gè)版本開始谦铃,根據(jù)符合 Conventional Commits 的提交信息小槐,計(jì)算下一個(gè)語義化版本。

使用約定式提交的項(xiàng)目

  • yargs:廣受歡迎的命令行參數(shù)解析器荷辕。
  • istanbuljs:一套為 JavaScript 測(cè)試生成測(cè)試覆蓋率的開源工具和類庫(kù)凿跳。
  • uPortal-homeuPortal-application-framework:用于增強(qiáng) Apereo uPortal 的可選用戶界面。
  • massive.js:一個(gè)用于 Node 和 PostgreSQL 的數(shù)據(jù)訪問類庫(kù)疮方。
  • electron:用 JavaScript控嗜、HTML 和 CSS 構(gòu)建跨平臺(tái)應(yīng)用。
  • scroll-utility:一個(gè)居中元素和平滑動(dòng)畫的滾屏工具包實(shí)例骡显。
  • Blaze UI:無框架開源 UI 套件疆栏。
  • Monica:一個(gè)開源的人際關(guān)系管理系統(tǒng)。
  • mhy:一個(gè)零配置惫谤、開箱即用的壁顶、多用途工具箱與開發(fā)環(huán)境。
  • @tandil/diffparse: 簡(jiǎn)單的 Diff 文件解析器(統(tǒng)一 diff 格式)溜歪。
  • @tandil/diffsplit: 快速將 .diff 和 .patch 拆分成獨(dú)立文件若专。
  • @thi.ng/umbrella: 數(shù)據(jù)驅(qū)動(dòng)開發(fā)的 ~100 個(gè) TypeScript 項(xiàng)目。
  • yii2-basic-firestarter: ?? Yii2應(yīng)用的增強(qiáng)模板蝴猪。
  • dcyou/resume: ?? 快速創(chuàng)建在線簡(jiǎn)歷的模板调衰。
  • Nintex Forms: 方便的創(chuàng)建動(dòng)態(tài)在線表單并獲準(zhǔn)確、實(shí)時(shí)數(shù)據(jù)自阱。
  • Tina CMS: 為你的網(wǎng)站創(chuàng)建前端內(nèi)容管理的開源工具集嚎莉。
  • Uno Platform: 使用 C# 和 XAML 創(chuàng)建移動(dòng)、桌面和 WebAssembly 應(yīng)用沛豌。今天趋箩,開源并給予專業(yè)支持。

[圖片上傳失敗...(image-31f075-1605002713878)]

想讓你的項(xiàng)目出現(xiàn)在上面嗎? 提交 pull request 吧叫确。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末跳芳,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子启妹,更是在濱河造成了極大的恐慌筛严,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件饶米,死亡現(xiàn)場(chǎng)離奇詭異桨啃,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)檬输,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門照瘾,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人丧慈,你說我怎么就攤上這事析命。” “怎么了逃默?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵鹃愤,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我完域,道長(zhǎng)软吐,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任吟税,我火速辦了婚禮凹耙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘肠仪。我一直安慰自己肖抱,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布异旧。 她就那樣靜靜地躺著意述,像睡著了一般。 火紅的嫁衣襯著肌膚如雪泽艘。 梳的紋絲不亂的頭發(fā)上欲险,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天,我揣著相機(jī)與錄音匹涮,去河邊找鬼。 笑死槐壳,一個(gè)胖子當(dāng)著我的面吹牛然低,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼雳攘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼带兜!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起吨灭,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤刚照,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后喧兄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體无畔,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年吠冤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了浑彰。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡拯辙,死狀恐怖郭变,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情涯保,我是刑警寧澤诉濒,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站夕春,受9級(jí)特大地震影響未荒,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜撇他,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一茄猫、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧困肩,春花似錦划纽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至潭枣,卻和暖如春比默,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背盆犁。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國(guó)打工命咐, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人谐岁。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓醋奠,卻偏偏與公主長(zhǎng)得像榛臼,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窜司,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容