このガイドラインでは、いくつかの状況を前提としています。
- 1コミットに1つの対応とする(WIPフローなどには対応していない)
- GitHubかBacklogを使用している
- SourceTreeのようなアプリケーションを使用している(CLIの説明はオプション)
- ベストよりもベター(誰でも簡単に導入できる)
コミットメッセージには「何を」「なぜ」したのかを書きます。
下記のように5W1Hに当てはめたときに、「いつ」「どこで」「誰が」「どうやって」はコミットメッセージ以外で分かるからです。
- いつ(When):タイムスタンプ
- どこで(Where):ファイル名・ディレクトリ名
- 誰が(Who):author(作者)
- 何を(What):コミットのタイトル(Subject)
- なぜ(Why):コミットメッセージ(Body)
- どうやって(How):コード・diff
コミットメッセージでは、「何をしたのか?」「なぜそれをしたのか?」を伝えることを主題とします。
コミットメッセージは以下のフォーマットを使用します。
<Prefix>: <Subject>
<Body>
<Footer>
<Subject>
はコミットのタイトル、<Body>
はコミットの本文、<Footer>
はコミットの補足です。
<Prefix>:
と<Subject>
の間は半角スペースを1つ入れてください。
<Subject>
と<body>
の間は空行を1つ挟んでください。空行がないと、git log --oneline
もしくはgit log --pretty=oneline --abbrev-commit
を実行したときに<Subject>
と<body>
が1行になって出力されてしまいます。視覚的に分離することで、読みやすくするという目的もあります。
<Prefix>
には、そのコミットで何をしたのかを英語の動詞で伝えます。
以下の動詞をベースにします。
動詞 | 説明 |
---|---|
Add: | (機能・ファイルなどを)追加する |
Fix: | (コードなどを)修正する |
Improve: | (コードなどを)改善する |
Update: | (パッケージやドキュメントなどを)更新する |
Remove: | (ファイル名やコードを)除去する |
Rename: | (ファイル名を)変更する |
Move: | (AをBに)移動する |
Change: | (AをBに)変更する |
Fix
はバグの修正専用に使うこともありますが、ここではコードなどの修正をまとめてFix
としています。
Update
はコード自体の更新には使いません。パッケージ(ライブラリ)やドキュメントをアップデートしたときに使います。
Improve
はパフォーマンス改善のようなリファクタリングをしたときに使います。
Remove
(除去、一部を取り除く)とDelete
(削除、完全に消す)は使い分けるほうが正確に伝えられますが、ここでは除去・削除含めてRemove
としています。
<Subject>
には、そのコミットで何をしたのかを文章で伝えます。
以下の点に注意してください。
- 50文字未満(もしくは72文字未満)に収める
- 長すぎると内容が把握しにくい
- GitHubでは50文字を越えると警告、72を越えると省略されてしまう
英語の場合は以下の点にも注意してください。
- 大文字で始める
- 動詞で始める
- ピリオドを省略する
<Body>
には、なぜ追加や修正、削除が必要だったのかを文章で伝えます。
リスト表示(-
か*
で始める)や改行・空行を入れて読みやすくしてください。
自己文書化(コメントがなくてもコードの意図が分かる)状態がベストですが、それが難しい場合はコメントをコードに残します。 コードを読むときに、わざわざコミットメッセージは探さないですよね。
コミットメッセージにも何をしたのかを残すこともできます。ただし、コード側でも充分に説明するようにしてください。
<Footer>
には、そのコミットの元になるイシュー番号(課題キー)を載せます。
GitHubにもBacklogにもイシュー番号(課題キー)をコミットメッセージに載せると、イシュー(課題)ページにコミット情報を登録することができます。
また、キーワードを含めると、状態も変更することができます。
- GitHub:
Closes #123
やCloses: #123
のようにコミットに含めると、コミット後にイシューもクローズする(Closing issues using keywords - User Documentation) - Backlog:
#fix
を含めると「処理済み」になり、#close
を含めると「完了」に状態を更新する(コミットログでの課題の操作 - Backlog(バックログ))