輕松解決規(guī)范化Git Commit

前言

規(guī)范化 git commit 對于提高 git log 可讀性、可控的版本控制和 changelog 生成都有著重要的作用。然而阻礙我們腳步的不只是團(tuán)隊的推廣买置,單單對于一系列工具的配置都讓人頭大角寸。這其中主要就是 commitlint 和 commitizen 的配合使用以及自定義提交規(guī)范。本文總結(jié)了目前的最佳實踐給大家弱贼,如果有幫助,賞個star足矣磷蛹。

Conventional Commits 約定式提交規(guī)范

Conventional Commits 是一種用于給提交信息增加人機(jī)可讀含義的規(guī)范吮旅。約定式提交規(guī)范是一種基于消息的輕量級約定。它提供了一組用于創(chuàng)建清晰的提交歷史的簡單規(guī)則味咳;這使得編寫基于規(guī)范的自動化工具變得更容易庇勃。這個約定與 SemVer 相吻合,在提交信息中描述新特性槽驶、bug 修復(fù)和破壞性變更责嚷。
提交說明的結(jié)構(gòu)如下所示:

類型(type)

feat:: 類型為 feat 的提交表示在代碼庫中新增了一個功能(這和語義化版本中的 MINOR 相對應(yīng))。
fix::類型為 fix 的 提交表示在代碼庫中修復(fù)了一個 bug (這和語義化版本中的 PATCH 相對應(yīng))掂铐。
docs:: 只是更改文檔罕拂。
style:: 不影響代碼含義的變化(空白、格式化全陨、缺少分號等)爆班。
refactor:: 代碼重構(gòu),既不修復(fù)錯誤也不添加功能辱姨。
perf:: 改進(jìn)性能的代碼更改柿菩。
test:: 添加確實測試或更正現(xiàn)有的測試。
build:: 影響構(gòu)建系統(tǒng)或外部依賴關(guān)系的更改(示例范圍:gulp雨涛、broccoli枢舶、NPM)懦胞。
ci:: 更改持續(xù)集成文件和腳本(示例范圍:Travis、Circle祟辟、BrowserStack医瘫、SauceLabs)。
chore:: 其他不修改src或test文件旧困。
revert:: commit 回退醇份。

范圍(scope)

可以為提交類型添加一個圍在圓括號內(nèi)的作用域,以為其提供額外的上下文信息吼具。例如 feat(parser): adds ability to parse arrays.僚纷。

BREAKING CHANGE

在可選的正文或腳注的起始位置帶有 BREAKING CHANGE: 的提交,表示引入了破壞性 API 變更(這和語義化版本中的 MAJOR 相對應(yīng))拗盒。 破壞性變更可以是任意 類型 提交的一部分怖竭。

示例

包含了描述以及正文內(nèi)有破壞性變更的提交說明
feat: allow provided config object to extend other configs

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

包含了可選的 ! 字符以提醒注意破壞性變更的提交說明
chore!: drop Node 6 from testing matrix

BREAKING CHANGE: dropping Node 6 which hits end of life in April

不包含正文的提交說明
docs: correct spelling of CHANGELOG

包含作用域的提交說明
feat(lang): add polish language

為 fix 編寫的提交說明,包含(可選的) issue 編號

fix: correct minor typos in code

see the issue for details on the typos fixed

closes issue #12

約定式提交規(guī)范

  1. 每個提交都必須使用類型字段前綴陡蝇,它由一個名詞組成痊臭,諸如feat或fix,其后接一個可選的作用域字段登夫,以及一個必要的冒號(英文半角)和空格广匙。
  2. 當(dāng)一個提交為應(yīng)用或類庫實現(xiàn)了新特性時,必須使用feat類型恼策。
  3. 當(dāng)一個提交為應(yīng)用修復(fù) bug 時鸦致,必須使用fix類型。
  4. 作用域字段可以跟隨在類型字段后面涣楷。作用有必須是一個描述某部分代碼的名詞,并用圓括號包圍狮斗,例如:fix(parser):
  5. 描述字段必須緊接在類型/作用域前綴的空格之后绽乔。描述指的是對代碼變更的簡短總結(jié)碳褒,例如:fix:array parsing issue
    when multiplejspaces were contained in string。
  6. 在簡短描述之后骤视,可以編寫更長的提交正文鹃觉,為代碼變更提供額外的上下文信息专酗。正文必須起始于描述字段結(jié)束的一個空行后盗扇。
  7. 在正文結(jié)束的一個空行之后沉填,可以編寫一行或或多行腳注。腳注必須包含關(guān)于提交的元信息翼闹,例如:關(guān)聯(lián)的合并請求焊唬、Reviewer、破壞性變更斧拍、每條元信息一行蜀备。
  8. 破壞性變更必須標(biāo)示在正文區(qū)域最開始處关摇,或腳注區(qū)域中某一行的開始。一個破壞性變更必須包含大寫的文本BREAKING
    CHANGE碾阁,后面緊跟冒號和空格输虱。
  9. 在BREAKING CHANGE:之后必須提供描述,以描述對 API 的變更脂凶。例如:BREAKING CHANGE:
    enviroment variables now take precedence over cofig files宪睹。
  10. 在提交說明中,可以使用feat和fix之外的類型蚕钦。
  11. 工具的實現(xiàn)必須不區(qū)分大小寫地解析構(gòu)成約定式提交的信息單元亭病,只有BREAKING CHANGE 必須是大寫的。
  12. 可以在類型/作用域前綴之后冠桃,:之前命贴,附加!字符,以進(jìn)一步提醒注意破壞性變更食听。當(dāng)有!前綴時胸蛛,正文或腳注內(nèi)必須包含BREAKING
    CHANGE: description

為什么使用約定式提交

  1. 自動化生產(chǎn) CHANGELOG。
  2. 基于提交的類型樱报,自動決定語義化的版本變更葬项。
  3. 向同事、公眾與其他利益關(guān)系者傳達(dá)變化的性質(zhì)迹蛤。
  4. 觸發(fā)構(gòu)建和部署流程民珍。
  5. 讓人們探索一個更加結(jié)構(gòu)化的提交歷史,以便降低對你的項目作出貢獻(xiàn)的難度盗飒。

cz-customizable

可自定義的Commitizen插件(或獨(dú)立實用運(yùn)行)可幫助實現(xiàn)一致的提交消息嚷量。
安裝 cz-customizable:
$ yarn add cz-customizable -D
復(fù)制代碼
向 package.json 添加新的 script:
{
“scripts” : {

“commit”: “./node_modules/cz-customizable/standalone.js”
}
}

在根目錄新建 .cz-config.js 并復(fù)制 cz-config-EXAMPLE.js 到文件。
效果:

commitlint
commitlint檢查您的提交消息是否符合conventional commit format逆趣。
1蝶溶、安裝 @commitlint/cli、husky:
$ yarn add -D @commitlint/cli husky

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

“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}梨州。這樣,你就可以在一個地方維護(hù) types 和 scopes田轧。
$ yarn add commitlint-config-cz -D
復(fù)制代碼
4暴匠、在 commitlint.config.js 中用 cz 擴(kuò)展您的 commitlint 配置:
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 時抹腿,檢查信息:
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

G I T H U B W O R K S P A C E i s t h e p a t h t o y o u r r e p o s i t o r y r u n : e c h o " : : s e t ? e n v n a m e = N O D E P A T H : : GITHUB_WORKSPACE is the path to your repository run: echo "::set-env name=NODE_PATH::GITHUBW?ORKSPACEisthepathtoyourrepositoryrun:echo"::set?envname=NODEP?ATH::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 標(biāo)準(zhǔn)規(guī)范 的版本和 changelog 自動化工具岛请。通常情況線下,我們會在 master 分支進(jìn)行如下的版本發(fā)布操作:

git pull origin master
根據(jù) package.json 中的 version 更新版本號警绩,更新 CHANGELOG
git add .
git commit
git tag 打版本操作
git push --tags:push 版本 tag 和 master 分支到倉庫

其中 2崇败,3,4肩祥,5 是 standard-version 工具會自動完成的工作后室,配合本地的 shell 腳本混狠,則可以自動完成一系列版本發(fā)布的工作了。

安裝 & 使用

$ yarn add -D standard-version

// 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以此方便發(fā)布實驗性特性
Prevent Git Hooks:yarn release --no-verify

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末予弧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子掖蛤,更是在濱河造成了極大的恐慌,老刑警劉巖致讥,帶你破解...
    沈念sama閱讀 211,561評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件器赞,死亡現(xiàn)場離奇詭異,居然都是意外死亡港柜,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,218評論 3 385
  • 文/潘曉璐 我一進(jìn)店門姚糊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來救恨,“玉大人,你說我怎么就攤上這事肠槽∩萆叮” “怎么了秸仙?”我有些...
    開封第一講書人閱讀 157,162評論 0 348
  • 文/不壞的土叔 我叫張陵寂纪,是天一觀的道長赌结。 經(jīng)常有香客問我,道長柬姚,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,470評論 1 283
  • 正文 為了忘掉前任搬设,我火速辦了婚禮撕捍,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘卦洽。我一直安慰自己,他們只是感情好该窗,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,550評論 6 385
  • 文/花漫 我一把揭開白布蚤霞。 她就那樣靜靜地躺著,像睡著了一般昧绣。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拖刃,一...
    開封第一講書人閱讀 49,806評論 1 290
  • 那天,我揣著相機(jī)與錄音央碟,去河邊找鬼。 笑死亿虽,一個胖子當(dāng)著我的面吹牛苞也,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播如迟,決...
    沈念sama閱讀 38,951評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼牛哺!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起引润,我...
    開封第一講書人閱讀 37,712評論 0 266
  • 序言:老撾萬榮一對情侶失蹤淳附,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奴曙,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,166評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡洽糟,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,510評論 2 327
  • 正文 我和宋清朗相戀三年坤溃,在試婚紗的時候發(fā)現(xiàn)自己被綠了嘱丢。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片薪介。...
    茶點(diǎn)故事閱讀 38,643評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡汁政,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出记劈,到底是詐尸還是另有隱情,我是刑警寧澤目木,帶...
    沈念sama閱讀 34,306評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響距贷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜忠蝗,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,930評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望阁最。 院中可真熱鬧,春花似錦速种、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,745評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至瘫拣,卻和暖如春亿絮,著一層夾襖步出監(jiān)牢的瞬間派昧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,983評論 1 266
  • 我被黑心中介騙來泰國打工斗锭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留失球,地道東北人帮毁。 一個月前我還...
    沈念sama閱讀 46,351評論 2 360
  • 正文 我出身青樓豺撑,卻偏偏與公主長得像,于是被迫代替她去往敵國和親聪轿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,509評論 2 348