erg/doc/JA/dev_guide/commit_message.md
2023-02-05 11:49:28 +09:00

6.7 KiB

コミットメッセージに関するガイドライン

badge

このガイドラインは、

  • コミットメッセージをどうやって書けば良いのかを明確化する
  • コミットメッセージを後から参照しやすくする

などを目的としています。努力目標であり、フォーマットから外れたコミットをした場合でも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