iT邦幫忙

1

Git Commit Message 規範

git
  • 分享至 

  • xImage
  •  

1.目標

  • 重新了解一段程式碼更動的脈絡很浪費腦力。雖然這件事情沒辦法完全避免,但是我們可以盡量降低這件事情的複雜度。Commit messages 正可以做到這點,而我們可以從 commit message 看出一個開發者是不是一位好的合作對象。
  • 統一格式後,將可以通過腳本自動產生 CHANGELOG.md
  • 統一格式後,將可以通過 git bisect 忽略不重要的提交,如排版格式化

2.Git commit message 的規則

  1. 用一行空白行分隔標題與內容
  2. 限制標題最多只有 50 字元
  3. 標題開頭要大寫
  4. 標題不以句點結尾
  5. 標題不需要禮貌,要直接有力以近乎命令式的祈使句來撰寫標題,舉例:把門關起來、把垃圾拿走
  6. 內文每行最多 100 字
  7. 用內文解釋 what 以及 why vs. how

2-1 Commit Message 的格式

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

commit message 的任何一行不能超過 100 個字元! 這樣可以使得 commit message 更容易在 github 以及各種 git 工具中閱讀。

commit message  由header、 body 和 footer 組成,由空白行分隔。


2-2  Commit Message 格式的定義

header

  • Message header 是一行簡潔的描述,其中包含 typescope 和 subject

  • 代表 commit 的類別:

    • feat (功能特點)

    • fix (修 bug)

    • docs (文件)

    • style (格式排版, 缺少分號…)

    • refactor (重構)

    • test (當補上缺少的測試時)

    • chore (維護)

  • scope 代表 commit 影響的範圍,例如資料庫、控制層、模板層等等,視專案不同而不同。 例如 $location, $browser, $compile, $rootScope, ngHref, ngClick, ngView, etc...
  • 如果沒有更合適的範圍,您可以使用 *****
  • 為可選欄位。

  • 代表此 commit 的簡短描述

    • 使用命令式, 使用現在式,例如: “change” 不要用 “changed” 也不要用 “changes”

    • text 第一個字母不要大寫

    • 末尾沒有點 (.) 不要加句號

    • 為必要欄位。

body

footer

  • Message header 是一行簡潔的描述,其中包含 typescope 和 subject

Breaking changes

  • 所有重大更改都必須在 footer 中的 "BREAKING CHANGE" 區塊裡提及,該區塊應以 BREAKING CHANGE 開頭:空格或兩個換行符。 然後,commit message 的其餘部分是對更改、理由和遷移說明的描述。
BREAKING CHANGE: isolate scope bindings definition has changed and
the inject option for the directive controller injection was removed.    
To migrate the code follow the example below:
    
    Before:    

    scope: {
      myAttr: 'attribute',
      myBind: 'bind',
      myExpression: 'expression',
      myEval: 'evaluate',
      myAccessor: 'accessor'
    }
    
    After:
   
    scope: {
      myAttr: '@',
      myBind: '@',
      myExpression: '&',
      // myEval - usually not useful, but in cases where the expression is assignable, you can use '='
      myAccessor: '=' // in directive's template change myAccessor() to myAccessor
    }

The removed `inject` wasn't generaly useful for directives so there should be no code using it.

Referencing issues

  • 已關閉的錯誤應列在頁腳的單獨行中,並以“Closes”關鍵字為前綴,如下所示:
    Closes #234

  • 或在多個問題的情況下:Closes #123, #245, #992

還原 Revert

  • 如果 commit 一個先前 commit 的還原 ,則其標頭應以 **revert:** 開頭,後面跟隨著 reverted commit 的標頭。

  • 在 body  中它應該說:This reverts commit <hash>.,其中 hash 是要恢復的提交的 SHA。


3.其他應用

3-1 自動產生 CHANGELOG.md

我們在變更日誌中使用這三個部分: new features, bug fixes, breaking changes.

此列表可以在發佈時由腳本生成。以及相關提交的鏈接。

當然,您可以在實際發布之前編輯此更改日誌,但它可以生成骨架。

自上次發布以來的所有主題列表(提交消息中的第一行):

>> git log <last tag> HEAD --pretty=format:%s

此版本中的新功能

>> git log <last release> HEAD --grep feature

3-2 識別不重要的提交

這些是格式更改 (adding/removing spaces/empty lines, indentation), missing semi colons, comments.

所以當你在尋找一些改變時,你可以忽略這些提交 - 此提交中沒有邏輯更改。

一分為二一目了然, 您可以通過以下方式忽略這些:

>> git bisect skip $(git rev-list --grep irrelevant <good place> HEAD)

3-3 瀏覽歷史紀錄時提供更多資訊

這將添加一種“context”資訊。

看看這些資訊 (取自最近幾個 Angular 的提交):

所有這些資訊都試圖指出它更改了哪裡。 但是他們缺少了規範...

看看這些資訊:

你能猜出裡面是什麼嗎?這些消息錯過了地方規範...These messages miss place specification...

所以也許像代碼的一部分:docs, docs-parser, compiler, scenario-runner, …

我知道,您可以通過檢查哪些文件已更改來找到此資訊,但這很慢。 在查看 git 歷史紀錄時,我可以看到我們所有人都試圖指出癥結點,但卻缺少了規範。


4. 範例

4-1 範例 feat

feat($browser): onUrlChange event (popstate/hashchange/polling)

Added new event to $browser:
- forward popstate event if available
- forward hashchange event if popstate not available
- do polling when neither popstate nor hashchange available

Breaks $browser.onHashChange, which was removed (use onUrlChange instead)

4-2 範例 fix

fix($compile): couple of unit tests for IE9

Older IEs serialize html uppercased, but IE9 does not...
Would be better to expect case insensitive, unfortunately jasmine does
not allow to user regexps for throw expectations.

Closes #392
Breaks foo.bar api, foo.baz should be used instead

4-3 範例 feat

feat(directive): ng:disabled, ng:checked, ng:multiple, ng:readonly, ng:selected

New directives for proper binding these attributes in older browsers (IE).
Added coresponding description, live examples and e2e tests.

Closes #351

4-4 範例 style

style($location): add couple of missing semi colons

4-5 範例 docs

docs(guide): updated fixed docs from Google Docs

Couple of typos fixed:
- indentation
- batchLogbatchLog -> batchLog
- start periodic checking
- missing brace

4-6 範例 BREAKING CHANGE

feat($compile): simplify isolate scope bindings

Changed the isolate scope binding options to:
  - @attr - attribute binding (including interpolation)
  - =model - by-directional model binding
  - &expr - expression execution binding

This change simplifies the terminology as well as
number of choices available to the developer. It
also supports local name aliasing from the parent.

BREAKING CHANGE: isolate scope bindings definition has changed and
the inject option for the directive controller injection was removed.

To migrate the code follow the example below:

Before:

scope: {
  myAttr: 'attribute',
  myBind: 'bind',
  myExpression: 'expression',
  myEval: 'evaluate',
  myAccessor: 'accessor'
}

After:

scope: {
  myAttr: '@',
  myBind: '@',
  myExpression: '&',
  // myEval - usually not useful, but in cases where the expression is assignable, you can use '='
  myAccessor: '=' // in directive's template change myAccessor() to myAccessor
}

The removed `inject` wasn't generaly useful for directives so there should be no code using it.

參考:


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
CooperWu
iT邦新手 3 級 ‧ 2023-02-24 17:16:03

不好意思,有個小小的問題想要請教。
關於[2-1 Commit Message的格式]中的內容,是打在commit的哪個部份呢?
因為commit有分Subject跟Description,
還是說第一行要打在Subject,第二行之後打在Description呢?
麻煩大大解惑,感謝

我要留言

立即登入留言