Git 每次提交代碼,都要寫 Commit message 來講明本次的提交內容。vue
git commit -m "hello word"
複製代碼
當提交的內容比較多的時候, 能夠執行 git commit
, 使用跳出來的文原本編輯提交信息。git
git commit
複製代碼
在項目開發過程當中, 使用 git commit 提交的信息能夠很好的反應項目的開發進展狀況。 因此應當規範 git message 的格式, 來更加清晰明瞭的說明每次的提交目的。github
關於 Git message 的寫法規範社區中有不少種, 目前使用較爲普遍的是 Angular 規範npm
在 Angular
規範中, 每次提交, Commit message 都包括三個部分: Header、Body 和 Footer;編程
<type>(<scope>):<subject> ## header 部分
// 空一行
<body> ## body 部分
// 空一行
<footer> ## footer 部分
複製代碼
::: tipjson
Header 部分只有一行, 包括三個字段: type
(必須)、scope
(可選)、subject
(必須);bash
type
用於說明 commit 的類型, 在 Angular 規範
種, 只容許 7 種經常使用類型和一種特殊類型(revert):工具
feat: 新功能 (feature)
fix: 修補 bug
docs: 文檔 (ocumentation)
style: 格式 (不影響代碼運行)
refactory: 重構 (既不是新增功能, 也不是修改 bug 的代碼改動)
test: 增長測試
chore: 構建過程或輔助工具的變更
revert: 撤銷之前的 commit; header 部分須要跟被撤銷 Commit 的 Header
複製代碼
scope
用於說明 commit
影響的範圍, 好比說數據層、控制層、視圖層等等測試
subject
是 commit
的簡短描述, 不超過 50 個字符。ui
::: tip 以動詞開頭, 使用第一人稱如今時, 好比 change
而不是 changed
或者 changes
第一個字母小寫 結尾不加句號 :::
body
部分是對本次 commit
的詳細描述, 能夠分爲多行。
在不少狀況下, 是不使用這部分的內容的, 可是在下面兩種狀況下,回使用到 footer
footer
部分須要使用 BREAKING CHANGE
開頭, 後面是對變更的描述以及變更理由和變更方法.BREAKING CHANGE: isolate scope bindings definition has changed.
To migrate the code follow the example below:
Before:
scope: {
myAttr: 'attribute',
}
After:
scope: {
myAttr: '@',
}
The removed `inject` wasn't generaly useful for directives so there should be no code using it. 複製代碼
issue
, 那個能夠在 footer 部分關閉 issue
Closes #123
複製代碼
關閉多個 issue
Closes #123, #234, #345
複製代碼
在項目的開發過程當中,編程人員遵照 Angular 規範
須要編寫更多的 git message 信息, 使用 Commitizen 來進行交互式的 message 輸入。
npm install -g commitizen
複製代碼
而後,在項目目錄裏,運行下面的命令,使其支持 Angular 的 Commit message 格式。
commitizen init cz-conventional-changelog --save --save-exact
複製代碼
當須要 git commit
的時候使用 git cz
來生成符合規範的 git message.
git cz
命令爲 git message 提供了一個規範的 message 模板, 這時使用 git commit -m
或者 使用 git cz
依舊不能嚴格限制 git message 內容, 爲了嚴格規範須要使用 commitlint 來拒毫不規範的 git message 內容。
npm install --save-dev @commitlint/config-conventional @commitlint/cli
複製代碼
echo "module.exports = {extends: ['@commitlint/config-conventional']};" > commitlint.config.js
複製代碼
package.json
文件中添加"commitlint": {
extnds: [
"@commitlint/config-conventional"
]
}
複製代碼
配置好 commitlint
, 還須要設置 觸發 commitlint
的時機。
Git
中自帶不一樣的 hook
, 當某些事件發生的時候,會觸發相對應的 hook
, 這些 hook
腳本存放在項目根目錄的 .git/hooks
目錄下。
commit-msg
是其中一個 hook
, 在 git commit
提交的時候觸發。 可使用 husky 來自定義 commit-msg
觸發時候的事件。
安裝 npm install husky -D
在 package.json
中添加代碼
"config": {
"ghooks": {
"commit-msg": "commitlint -e $GIT_PARAMS"
}
}
複製代碼
在 git commit-msg
這個鉤子中會觸發 commitlint
的操做。
在完成了 git message
的校驗以後, 能夠繼續使用 lint-staged 和 git hooks
來進行代碼提交前的語法、風格的驗證和修復。
安裝 npm install -D lint-staged
在跟目錄下建立 .lintstagedrc
, 並寫入
{
"*.{js,vue}": ["eslint --fix", "git add"]
}
複製代碼
package.json
中寫入"lint-staged": {
"*.{js,vue}": ["eslint --fix", "git add"]
}
複製代碼
husky
配置中添加觸發時機"husky": {
"hooks": {
"pre-commit": "lint-staged"
}
}
複製代碼
這樣在每次提交以前都會觸發 pre-commit
這個 hook
, 從而觸發 .lintstagedrc
或者 package.json
中的 lint-staged
裏面的配置。 在例子中,咱們配置了對全部 .js
或者 .vue
結尾的文件進行 eslint
的修復, 而且當修復以後再次執行 git add
將修改後的文件再次放到暫存區。 這樣就能夠保證每次提交的代碼都是統一風格的代碼了。
::: tip lint-staged
只對這次提交所在暫存區的文件(git add後的文件)進行一系列的檢查、修復、格式化操等做。 :::
當使用 Angular 規範
提交 git message
, 還可使用 standard-version生成 Change log
文檔。 生成的文檔將會包括下面三個部分。
new features // 新增功能記錄
bug fixes // 解決 bug 記錄
breaking changes // 不兼容變更記錄
複製代碼
每一部分都會列出相關的 commit
, 而且指向這些 commit
的鏈接。 conventional-changelog
使用以下:
npm install -g standard-version
複製代碼
package.json
中添加 script
字段"script": {
"release": "standard-version"
}
複製代碼
運行 npm run release
將會執行下面的步驟。
1. 修改 package.json package-lock.json 中的版本號
2. 生成 CHANGELOG.md 文件。
3. 提交 package.json package-lock.json CHANGELOG.md 文件
4. 給本次提交打上 tag
複製代碼