是時(shí)候規(guī)范一下我們的git commit了

Angular 規(guī)范使用代碼 commit 的方式

概要說明:Git 每次提交代碼都要寫 commit message (提交說明),否則就不允許提交。但是, 一般來說,commit message 應(yīng)該清晰明了,說明本次提交的目的,可就是有一些人寫了些亂七八糟的東西上來。目前社區(qū)有很多種 commit message 方案,其中 Angular規(guī)范是目前使用最廣的寫法,比較合理和系統(tǒng)化,并且有配套的工具。前前端框架 Angular.js 采用的就是該規(guī)范。

1. 使用 Angular commit Standard 的作用

- 方便查看每次提交版本更新內(nèi)容: `git log <last tag> HEAD --pretty=format:%s`
- 方便的查找某個(gè)關(guān)鍵技術(shù)處在哪個(gè)版本: `git log <last release> HEAD --grep feature`
- 可以自動(dòng)生成 `CHANGELOG`
- 可讀性好,方便做 `code revieing`
- 方便 `git blame` 跟蹤工程歷史,追究模塊責(zé)任,提高代碼質(zhì)量

2. 提交格式

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

例如:
feat(route, controller, service): add users module

we add users entity for mutil method apis
  • 其中 Header 一行是必須的,BodyFooter 是可選的。
  • 建議提交的說明部分不一行要太長,影響單行顯示效果

3. 提交格式詳細(xì)說明

  • Header: 只有一行,包括三個(gè)字段:type(必需)、scope(可選)和 subject(必需)。
    • type: 用于說明 commit 的類別,只允許使用下面7個(gè)標(biāo)識(shí)。如果type為 feat和fix,則該 commit 將肯定出現(xiàn)在 CHANGELOG 中。其他情況(docs、chore、style、refactor、test)由你決定,要不要放入 CHANGELOG,建議不要。
    feat:新功能(feature)
    fix:修補(bǔ)bug
    docs:文檔(documentation)
    style: 格式(不影響代碼運(yùn)行的變動(dòng))
    refactor:重構(gòu)(即不是新增功能,也不是修改bug的代碼變動(dòng))
    test:增加測(cè)試
    chore:構(gòu)建過程或輔助工具的變動(dòng)
    
    • scope: 用于說明 commit 影響的范圍,比如數(shù)據(jù)層、控制層、視圖層等等,如果你的修改影響了不止一個(gè) scope,可以使用*代替。。
    • subject: subjectcommit 目的的簡(jiǎn)短描述,不超過50個(gè)字符。
    • 以動(dòng)詞開頭,使用第一人稱現(xiàn)在時(shí),比如 change,而不是changed或changes
    • 第一個(gè)字母小寫
    • 結(jié)尾不加句號(hào)(.)
  • Body: 對(duì)本次 commit 的詳細(xì)描述,可以分成多行。下面有一個(gè)范例。
    • 使用第一人稱現(xiàn)在時(shí),比如使用 change 而不是 changed或changes
    • 永遠(yuǎn)別忘了第2行是空行。
    • 應(yīng)該說明代碼變動(dòng)的動(dòng)機(jī),以及與以前行為的對(duì)比。
    More detailed explanatory text, if necessary.  
        Wrap it to about 72 characters or so. 
    Further paragraphs come after blank lines.
    - Bullet points are okay, too
    - Use a hanging indent
    
  • Footer:
    • 不兼容變動(dòng): 如果當(dāng)前代碼與上一個(gè)版本不兼容,則 Footer 部分以 BREAKING CHANGE 開頭,后面是對(duì)變動(dòng)的描述、以及變動(dòng)理由和遷移方法。
      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.
      
    • 關(guān)閉issue: 如果當(dāng)前 commit 針對(duì)某個(gè) issue ,那么可以在 Footer 部分關(guān)閉這個(gè) issue 。
      Closes #234
      Closes #234,#231,#424
      

4. 使用工具提交代碼

  • 可以使用典型的 gitflow 或通過使用CLI向?qū)?commitizen 來添加提交消息格式。
  • 安裝CLI工具并使其支持 Angular 規(guī)范
    npm install -g commitizen
    commitizen init cz-conventional-changelog --save --save-exact
    
  • 后續(xù)所有的 git commit 都用 git cz 代替。

5. 如何生成 CHANGELOG

  • 如果你的所有 commit 都符合 Angular 格式,那么發(fā)布新版本時(shí),CHANGELOG 就可以用 conventional-changelog 腳本自動(dòng)生成。
  • 生成的文檔包括以下三個(gè)部分: New features, Bug fixes, Breaking changes
  • 每個(gè)部分都會(huì)羅列相關(guān)的 commit ,并且有指向這些 commit 的鏈接。生成的文檔允許手動(dòng)修改,所以發(fā)布前,你還可以添加其他內(nèi)容。
  • 生成 CHANGELOG 請(qǐng)依次執(zhí)行下面的命令
    npm install -g conventional-changelog
    cd my-project
    conventional-changelog -p angular -i CHANGELOG.md -w
    

6. 參考

7. 相關(guān)問題解答

  1. 妹妹:不用工具,我們團(tuán)隊(duì)手動(dòng)書寫的提交消息亂七八糟的怎么辦?

    哥哥:那你裝個(gè) Commitizen 不行? 或者使用 validate-commit-msg 包校驗(yàn)提交是否符合規(guī)范,類似于 pre-commit 攔截。

  2. 妹妹:每次一個(gè)版本發(fā)布生成 CHANGELOG 的命令好長,我記不???

    哥哥:你可以把它寫進(jìn) Ppackage.json 文件的 script 中啊。像我這樣以后就只要運(yùn)行 npm run changlog 生成 CHANGELOG: "changelog": "conventional-changelog -p angular -i CHANGELOG.md -w"。

  3. 妹妹:提問?

    哥哥:生動(dòng)舉例的回答。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容