Git規(guī)范實踐

規(guī)范說明

git commit message即代碼提交歷史狸演,錯誤的提交信息會影響代碼的可維護(hù)性。在多人協(xié)作開發(fā)場景下因個人風(fēng)格各有不同椿争,若無統(tǒng)一的規(guī)范則很容易導(dǎo)致混亂倍奢。目前規(guī)范使用較多的是 Angular 團(tuán)隊的規(guī)范

消息提交格式

每個提交消息都包含一個header煮纵、body懂鸵、footerheader具有一種特殊的格式行疏,其中包括type匆光,scopesubject

<type>(<scope>): <subject>
<BLANK LINE>
<body>
<BLANK LINE>
<footer>

為使在各種git工具中更易于閱讀,提交消息的任何一行都不能超過100個字符酿联。

Header

  • type
    必須為以下之一開頭:

    • feat:一項新的功能feature
    • fix: bug修復(fù)
    • docs: 只修改了文檔
    • style: 沒有代碼的更改终息,樣式調(diào)整(空白,格式贞让,缺少分號等)
    • refactor: 代碼重構(gòu)周崭,既不修正bug也不增加功能(feature)的更改
    • perf: 改進(jìn)性能的代碼更改
    • test: 添加缺失或更正現(xiàn)有測試
    • build: 影響構(gòu)建系統(tǒng)或外部依賴項的更改,如:gulp, broccoli, npm
    • ci: 對CI配置文件和腳本的更改喳张,如:Travis续镇,Circle,BrowserStack销部,SauceLabs
    • chore: 更改構(gòu)建過程或輔助工具和庫摸航,例如文檔生成等
    • revert: 如果該提交還原了先前的提交,則應(yīng)以revert:開頭 柴墩,后接reverted commitheader忙厌。此外body中應(yīng)該標(biāo)明:This reverts commit <hash>凫岖,其中hash是要還原的提交的SHA值江咳。
  • scope
    scope是可選的。
    用于輔助說明所要提交代碼更改的內(nèi)容歸屬哥放,例如可以指明是哪個位置(location)歼指、哪個模塊(module)、哪個組件(componet)等甥雕。當(dāng)更改影響的范圍不止一個范圍時踩身,可以使用*

  • subject
    該主題包含對變更的簡潔描述:
    使用現(xiàn)在時態(tài):“change”不是“ changed”也不是“ changes”
    不要大寫第一個字母
    末尾沒有點(社露。)

Body

就像在主題(subject)中一樣挟阻,使用命令式現(xiàn)在時態(tài):“change”而不是“changed”或“changes”。 body應(yīng)包括改變的動機(jī),并將其與以前的行為進(jìn)行對比附鸽。

Footer

  • 不兼容變動
    如果當(dāng)前代碼與上一個版本不兼容脱拼,則 Footer 部分以 BREAKING CHANGE 開頭,用空格或兩個換行符,后面是對變動的描述坷备、以及變動理由和遷移方法熄浓。如fix并攜帶BREAKING CHANGE信息:
fix: correct spelling of referrer in header

BREAKING CHANGE: Rather than using misspelled "Referer" as name of header,
instead use correct spelling "Referrer". Clients expecting "Referer" will no
longer receive that header  and will presumably not honor the new "Referrer"
until updated to support this new name for this header.
  • 關(guān)閉 Issue
    如果當(dāng)前 commit 針對某個issue,那么可以在 Footer 部分關(guān)閉這個關(guān)聯(lián)issue 省撑。
Closes #123

或者關(guān)閉多個issue

Closes #123 #456 #789

GitHub關(guān)聯(lián)issue說明:https://docs.github.com/en/github/managing-your-work-on-github/linking-a-pull-request-to-an-issue

項目配置

現(xiàn)在比較流行的方案是約定式提交規(guī)范(Conventional Commits)赌蔑,它受到了 Angular 提交準(zhǔn)則的啟發(fā),并在很大程度上以其為依據(jù)竟秫。筆者嘗試查找了基于非node環(huán)境相關(guān)的Git規(guī)范化的輔助工具或插件娃惯,并沒有找到很好的解決方案,而我們?nèi)绻麚碛衝ode環(huán)境非node項目也可以正常配置執(zhí)行肥败,只不過在工程中會生成node項目相關(guān)的文件石景,如node_modules文件夾、package.json文件等拙吉,因此在項目的版本控制中稍微麻煩一些潮孽,根據(jù)需要定義自己的ingore文件,處理好項目代碼和環(huán)境代碼的問題筷黔。

環(huán)境和工具

  • node
  • npm(npx)
  • commitizen/cz-cli: 是一個格式化commit message的工具往史,可以約束提交者按照制定的規(guī)范一步一步的填寫commit message。
  • cz-conventional-changelog: 為 commitizen 指定一個 Adapter ,一個符合 Angular 團(tuán)隊規(guī)范的 preset(按照我們指定的規(guī)范幫助我們生成 commit message)

非node項目

定位到workspace目錄(即項目根目錄)命令行輸入npm init佛舱,執(zhí)行后會出現(xiàn)一系列初始化的提示椎例,可以一直回車至結(jié)束。npm init 相關(guān)說明:https://www.npmjs.cn/cli/init/请祖。

依賴安裝

  • 安裝commitizencz-conventional-changelog
npm i -D commitizen
npm i -D cz-conventional-changelog
  • 修改package.json文件
    工程的配置示例.png
{
  "name": "testp",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "commit": "git-cz"
  },
  "config": {
    "commitizen": {
      "path": "node_modules/cz-conventional-changelog"
    }
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "commitizen": "^4.2.3",
    "cz-conventional-changelog": "^3.3.0"
  }
}

在項目根目錄订歪,命令行執(zhí)行npm run commit,會出現(xiàn)操作步驟提示肆捕,按前文所訴填寫規(guī)范化信息刷晋。

操作提示.png

操作提示..png

執(zhí)行完,sourcetree效果圖:
效果圖.png

Commit信息校驗和攔截

雖然我們在項目中配置了commit慎陵,但是如果我執(zhí)行規(guī)范操作眼虱,不使用npm run commit提交代碼,通過命令行或者Git可視化工具直接commit席纽,那么提交上去的可能是不規(guī)范的信息捏悬,因此需要對git命令進(jìn)行攔截,并對message內(nèi)容做lint操作润梯。

  • lint工具依賴安裝
    • commitlint/cli 【命令行工具】
    • commitlint/config-conventional 【校驗規(guī)則】符合 Angular團(tuán)隊規(guī)范过牙。
npm i -D @commitlint/config-conventional @commitlint/cli
  • 修改 package.json甥厦,配置commitlint
{
   ...
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1",
    "commit": "git-cz",
    "commit-lint": "commitlint -e $HUSKY_GIT_PARAMS"
  },
  "config": {
    "commitizen": {
      "path": "node_modules/cz-conventional-changelog"
    }
  },
  "commitlint": {
    "extends": [
      "@commitlint/config-conventional"
    ]
  },
  ...
}
  • 安裝Husky,進(jìn)行git hooks校驗
  npm install husky --save-dev
  • 啟用git hooks
npx husky install 

git hooks啟用后會在項目根目錄下生產(chǎn).husky的文件夾

image.png

  • 添加commit_msg到husky寇钉,用于攔截git commit命令
npx husky add .husky/commit-msg "npm run commit-lint"

執(zhí)行完成后會生成commit-msg的腳本

commit-msg-shell.png

此時我們在命令行直接執(zhí)行git commit -m "test message"矫渔,會被攔截提示提交失敗。
image.png

SourceTree的問題

通過上面配置完成后用SourceTree提交代碼會發(fā)現(xiàn)運(yùn)行錯誤摧莽。

image.png

這是因為SourceTree沒有讀取到環(huán)境變量信息庙洼,需要在commit-msg腳本中添加環(huán)境變量的配置。
image.png

#!/bin/sh
. "$(dirname "$0")/_/husky.sh"

export PATH=/usr/local/bin:$PATH
npm run commit-lint --silent

此刻再運(yùn)行镊辕,已成功攔截


image.png

說明

  • cz-conventional-changelog提交信息提示和@commitlint/config-conventionallint規(guī)則都可以設(shè)置自定義的Adapter油够,可以根據(jù)自己需要配置適合自己團(tuán)隊的規(guī)范。
  • 文章截圖是以非node(Android)項目的視角進(jìn)行的配置征懈,其他項目也類似石咬,只要使用的Git進(jìn)行的版本控制,都可以實現(xiàn)Commit Message的規(guī)范化校驗卖哎。
  • 文章依賴的是Mac OS鬼悠,Windows下類似,所有的依賴庫在Windows下也可運(yùn)行工作亏娜,只不過環(huán)境的配置方式不同而已焕窝。
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市维贺,隨后出現(xiàn)的幾起案子它掂,更是在濱河造成了極大的恐慌,老刑警劉巖溯泣,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件虐秋,死亡現(xiàn)場離奇詭異,居然都是意外死亡垃沦,警方通過查閱死者的電腦和手機(jī)客给,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來肢簿,“玉大人靶剑,你說我怎么就攤上這事∫胝蹋” “怎么了抬虽?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵官觅,是天一觀的道長纵菌。 經(jīng)常有香客問我,道長休涤,這世上最難降的妖魔是什么咱圆? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任笛辟,我火速辦了婚禮,結(jié)果婚禮上序苏,老公的妹妹穿的比我還像新娘手幢。我一直安慰自己,他們只是感情好忱详,可當(dāng)我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布围来。 她就那樣靜靜地躺著,像睡著了一般匈睁。 火紅的嫁衣襯著肌膚如雪监透。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天航唆,我揣著相機(jī)與錄音胀蛮,去河邊找鬼。 笑死糯钙,一個胖子當(dāng)著我的面吹牛粪狼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播任岸,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼再榄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了享潜?” 一聲冷哼從身側(cè)響起不跟,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎米碰,沒想到半個月后窝革,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吕座,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年虐译,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吴趴。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡漆诽,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出锣枝,到底是詐尸還是另有隱情厢拭,我是刑警寧澤,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布撇叁,位于F島的核電站供鸠,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏陨闹。R本人自食惡果不足惜楞捂,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一薄坏、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧寨闹,春花似錦胶坠、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椭蹄,卻和暖如春矮瘟,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背塑娇。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工澈侠, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人埋酬。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓哨啃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親写妥。 傳聞我的和親對象是個殘疾皇子拳球,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,044評論 2 355

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