6.7 KiB
コミットメッセージに関するガイドライン
このガイドラインは、
- コミットメッセージをどうやって書けば良いのかを明確化する
- コミットメッセージを後から参照しやすくする
などを目的としています。努力目標であり、フォーマットから外れたコミットをした場合でもrebaseして修正などを要求するものではありません(直前のコミットメッセージを変更したい場合は--amend
オプションが使えます)。
あなたが守るべきガイドラインは以下の2点です。
- 自動的につけられたコミットメッセージ(e.g.
Update xxx.md
,Automatic update xxx
,Merge pull request #XXX ...
)は手を加えずそのまま送る - 手動コミットのメッセージはconventional commitsに準拠する
conventional commitsのBNFは以下のようになっています。
commit ::= type ('(' scope ')')? '!'? ':' description body? footer*
type ::= 'feat' | 'fix' | 'docs' | 'style' | 'refactor' | 'perf' | 'test' | 'build' | 'ci' | 'chore' | 'revert'
我々はGitHub上で開発するので、これを少し拡張して、issue/PR番号をdescriptionの後に追加して良いことにします。
commit ::= type ('(' scope ')')? '!'? ':' description ('(' '#' issue ')')? body? footer*
各部分の意味は以下の通りです。
type
はcommitの型を表します。小文字で書いてください(自動commitは大文字で始まるので、これによって手動コミットかどうかを区別します)
type | 説明 |
---|---|
feat |
新しい機能 |
fix |
バグの修正やissueの解決 |
docs |
ドキュメントの変更 |
style |
コードスタイルの変更 |
refactor |
リファクタリング |
perf |
パフォーマンスの改善 |
test |
テストの追加や変更 |
build |
ビルド関連・バージョン・依存関係の変更 |
ci |
CI関連の変更 |
chore |
内部的・軽微な変更 |
revert |
revert |
複数該当する場合は、より具体的なtypeを選んでください。優先度の低いtypeはfix
, refactor
, style
, chore
になります。例えば、ドキュメント(docs)の修正(fix)はdocs
、テスト(test)のリファクタリング(refactor)はtest
になります。
-
scope
は省略可能で、コミットの影響範囲を表します。例えば、fix(parser):
というコミットメッセージはパーサーのバグ修正であることを示します。コンマ区切りで複数のスコープを指定することもできますが、その場合コミットを分割することも検討してください。スコープの例は以下の通りです。parser
compiler
els
REPL
linter
-
!
マークはコミットが破壊的な変更であることを示します。このマークがついている場合、破壊的変更の理由を書く必要があります。破壊的変更は、言語の仕様変更やコンパイラAPIの変更などが該当します。 -
description
はコミットの概要を表します。あまり短すぎてはいけませんが、おおよそ50文字以内に収めるべきです。原則として英語で書いてください。大文字の単語で始まるとき以外は小文字で始めてください。ピリオドは付けないでください。 -
body
は省略可能で、コミットの詳細を表します。 -
footer
は省略可能で、コミットの関連情報を表します(レビュアーの一覧や、関連するissue/PR番号を書くなど)。
例としては以下になります。
feat(parser): add support for foo (#123)
fix: address CVE-XXXX-YYYY
Ref: https://cve.mitre.org/...
docs!: remove `xxx.md`
The contents of xxx.md are old and inaccurate, so it is deleted.
docs: update commit hash of `xxx.md`
refactor(compiler): `Foo` => `FooBar`
build: update version (v0.1.2 => v0.1.3)
style: fix typo
例から分かる通り、APIやファイル・ディレクトリ名は``で囲ってください。
補足
作業途中のコミットは自由に書いて構いません。最終的にsquash等をして整理するときに、規則に従ってください。 文は特に理由のない場合現在形・現在進行形で書いてください。
テンプレートの設定
もしテンプレートを利用したい場合は以下のコマンドを利用してください
git config commit.template .gitmessage
これによりErgのリポジトリ内でのみこのコミットメッセージのテンプレートが利用されます
# type(scope): description (#issue)
# body
# Wrap at 72 chars. ################################## which is here: #
#
# footer
# Wrap at 72 chars. ################################## which is here: #
#
########################################################################
#
# ## Help ##
#
# ## type: must ##
# feat: new feature
# fix: bug fix or issue resolution
# docs: documentation changes
# style: code style changes
# refactor: refactoring
# perf: performance improvement
# test: adding or changing tests
# build: build-related/version/dependency
# ci: CI-related changes
# chore: internal/minor changes
# revert: revert commit
# * fix, refactor, style and chore are lower priority
#
# ## scope: optional ##
# Indicates the scope
# e.g.
# - parser
# - compiler
# - els
# - REPL
# - linter
#
# ## !: optional ##
# Destructive change
#
# ## description: must ##
# Summary of the commit
# No more than 50 chars
#
# ## issue: optional ##
# Related issue/PR number
#
# ## body: optional ##
# Indicates the details of the commit
#
# ## footer: optional ##
# Represents information related to the commit