Gitでコミットするとき、「コミットメッセージに何を書けばいいのだろう?」と迷ったことはありませんか?
チーム開発では、コミットメッセージの書き方が人によって異なり、後から変更履歴を確認しにくくなることもあります。
そんなときに役立つのが、.gitmessageです。
この記事では、.gitmessageの設定方法、テンプレートの書き方、Gitトレイラーとの関係まで、初心者向けにわかりやすく解説します。
.gitmessageとは?
.gitmessageとは、Gitのコミットメッセージを書くときに使用するテンプレートファイルです。
Gitでは、コミットを作成するときに、「何を変更したのか」を説明するコミットメッセージを入力します。
例えば、次のようなメッセージです。
ログイン画面のエラー表示を修正しかし、チームで開発していると、コミットメッセージの書き方を統一したい場合があります。例えば、次のようなルールです。
- 1行目には変更内容を簡潔に書く
- 変更した理由を記載する
- 関連するIssue番号を記載する
- レビュー担当者などの情報を記載する
毎回これらのルールを思い出しながら入力するのは大変です。また、人によって書き方が異なると、後から変更履歴を確認しにくくなることもあります。
そこで役立つのが、.gitmessageです。
あらかじめコミットメッセージのひな形を用意しておき、コミット時に表示させることで、何を書けばよいのかを確認しながら入力できます。
例えば、次のようなテンプレートを作成できます。
# 変更内容を簡潔に記載
# 変更した理由や詳細を記載
# 関連Issue:#から始まる行は、何を入力するかを案内するためのコメントです。この案内を参考にして、実際の変更内容や理由を自分で入力します。
例えば、ログイン画面の不具合を修正した場合は、次のようなコミットメッセージを作成できます。
ログイン画面のエラー表示を修正
認証に失敗した場合でもエラーメッセージが表示されない
問題を修正した。
Refs: #123このように、.gitmessageは「何を書くかを案内するひな形」であり、実際のコミットメッセージは「そのひな形を参考にして入力した変更内容」です。
なお、#から始まる行は、通常はコメントとして扱われ、コミット時に取り除かれるため、実際のコミットメッセージには含まれません。なお、コメントとして扱う文字やコミットメッセージの整形方法はGitの設定で変更できるため、設定によっては動作が異なる場合があります。
実際には、次のような流れで使用します。
.gitmessage(ひな形)
↓
git commitを実行
↓
エディタにひな形が表示される
↓
変更内容や理由を入力する
↓
コミットメッセージとして保存されるつまり、.gitmessageを設定しておけば、コミットするたびに「何を書けばよいか」を確認できるようになります。
なお、.gitmessageというファイル名は、慣習的によく使われる名前です。
Gitがこの名前を特別に認識するわけではなく、設定で指定すれば別のファイル名でも使用できます。
.gitmessageを使うメリット
.gitmessageを使用すると、コミットメッセージをチーム内で統一しやすくなります。
コミットメッセージの書き忘れを防げる
テンプレートに必要な項目を用意しておけば、変更理由やIssue番号などを記載するきっかけになります。
例えば、「何を変更したか」だけでなく「なぜ変更したか」も残すようにできます。
変更履歴を後から確認しやすくなる
コミットメッセージが統一されていると、git logなどで履歴を確認したときに、変更内容を理解しやすくなります。
git log --onelinea1b2c3d ログイン画面のエラー表示を修正
e4f5g6h ユーザー登録時の入力チェックを追加特に、変更理由や関連Issueが記載されていると、後から不具合を調査するときにも役立ちます。
チームのコミットルールを共有しやすい
新しく参加したメンバーも、テンプレートを見ることで、チームが求めるコミットメッセージの形式を理解できます。
ただし、.gitmessageはあくまで入力を補助する仕組みです。テンプレートを設定しただけで、必須項目の入力や形式が強制されるわけではありません。
.gitmessageの設定方法
ここからは、実際に.gitmessageを作成してGitに設定する方法を見ていきましょう。
設定方法には、「現在のリポジトリだけに適用する方法(ローカル設定)」と「ユーザー全体に適用する方法(グローバル設定)」の2種類があります。
| 設定方法 | 適用範囲 |
|---|---|
| ローカル設定 | 現在のGitリポジトリのみ |
| グローバル設定 | 現在のユーザーが使用するGitリポジトリ全体 |
現在のリポジトリだけに適用する場合(ローカル設定)
特定のプロジェクトだけでテンプレートを使用したい場合は、ローカル設定を使用します。
まず、対象のGitリポジトリのルートディレクトリに、.gitmessageという名前のテキストファイルを作成します。
作成したファイルに、次のようなテンプレートを記載します。
# 変更内容を簡潔に記載
# 変更した理由や詳細を記載
# 関連Issue:次に、対象のリポジトリのルートディレクトリで次のコマンドを実行します。
git config --local commit.template .gitmessageコマンドが正常に実行された場合、特にメッセージは表示されません
これで、現在のリポジトリだけにテンプレートが適用されます。
--localは、現在のGitリポジトリに設定を保存するためのオプションです。--localを付けずにgit config commit.template .gitmessageと実行しても、通常はローカル設定になりますが、適用範囲を明確にするために--localを付けておくとよいでしょう。
ユーザー全体に適用する場合(グローバル設定)
普段使用するすべてのリポジトリで同じテンプレートを使いたい場合は、グローバル設定を使用します。
まず、ホームディレクトリに.gitmessageという名前のテキストファイルを作成します。
ホームディレクトリは、現在のユーザーの個人用ディレクトリのことです。例えば、WindowsではC:\Users\ユーザー名、LinuxやWSLでは/home/ユーザー名などがホームディレクトリにあたります。
作成したファイルに、次のようなテンプレートを記載します。
# 変更内容を簡潔に記載
# 変更した理由や詳細を記載
# 関連Issue:次に、次のコマンドを実行します(~はホームディレクトリを表します)。
git config --global commit.template ~/.gitmessage--globalを付けることで、現在のユーザーが使用するGitリポジトリ全体に設定が適用されます。
~/.gitmessageという書き方は、Linux、macOS、WSLやWindowsのGit Bashで使用できます。WindowsのPowerShellやコマンドプロンプトを使用する場合は、環境に応じてC:/Users/ユーザー名/.gitmessageのようなパスを指定してください。
リポジトリごとに別のローカル設定がある場合は、通常、そのローカル設定が優先されます。
設定できたか確認する
現在のリポジトリで有効になっているテンプレート設定は、次のコマンドで確認できます。
git config --get commit.template実行結果は、設定内容によって次のように異なります。
# ローカル設定で.gitmessageを設定している場合
.gitmessage
# グローバル設定の場合(使用しているOSや環境によって表示されるパスが異なります)
C:/Users/user01/.gitmessage ← windowsの場合
/home/user01/.gitmessage ← WSLの場合設定したファイルのパスが表示されれば、テンプレートの設定は完了しています。なにも設定していないときには、何も表示されません。
また、どの設定ファイルから読み込まれているか確認したい場合は、次のコマンドを使用します。
git config --show-origin --get commit.template実行結果は、設定内容によって次のように異なります。
# ローカル設定で.gitmessageを設定している場合
file:.git/config .gitmessage
# グローバル設定の場合(使用しているOSや環境によって表示されるパスが異なります)
file:C:/Users/user01/.gitconfig C:/Users/user01/.gitmessage ← windowsの場合
file:/home/user01/.gitconfig /home/user01/.gitmessage ← WSLの場合このように、--show-originを付けると、「どの設定ファイルの設定が使われているのか」まで確認できます。なにも設定していないときには、何も表示されません。
コミット時にテンプレートを使用する
設定が完了したら、ファイルを変更してステージングした後、メッセージを指定せずにgit commitを実行します。
git add .
git commitすると、Gitがコミットメッセージを編集するためのエディタを起動し、設定した.gitmessageのテンプレートが表示されます。また、その下には、現在のブランチ名や変更されたファイル名など、Gitが自動で追加する情報も表示されます。
例えば、次のように表示されます。
# 変更内容を簡潔に記載
# 変更した理由や詳細を記載
# 関連Issue:
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch <ブランチ名>
# Changes to be committed:
# new file: <追加したファイル名>
# modified: <変更したファイル名>
# deleted: <削除したファイル名>
#
# Changes not staged for commit:
# modified: <変更したファイル名>
# deleted: <削除したファイル名>
#
# Untracked files:
# <追加したファイル名><ブランチ名>や<変更したファイル名>の部分には、実際のGitリポジトリの状態に応じた値が表示されます。
それぞれの表示内容は、次のような意味です。
On branch:現在作業しているブランチChanges to be committed:ステージング済みで、今回のコミット対象になっている変更Changes not staged for commit:変更されているものの、まだステージングされていないファイルUntracked files:Gitでまだ管理されていない新しいファイル
なお、上部の「変更内容を簡潔に記載」などは.gitmessageで用意したテンプレートで、それより下のブランチ名やファイルの状態などはGitが自動で表示する情報です。
例えば、次のように入力します。
ログイン画面のエラー表示を修正
認証に失敗した場合でもエラーメッセージが表示されない
問題を修正した。
Refs: #123
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch <ブランチ名>
# Changes to be committed:
# new file: <追加したファイル名>
# modified: <変更したファイル名>
# deleted: <削除したファイル名>
#
# Changes not staged for commit:
# modified: <変更したファイル名>
# deleted: <削除したファイル名>
#
# Untracked files:
# <追加したファイル名>保存してエディタを閉じると、入力した内容でコミットが作成されます。また、#から始まる行は説明用のコメントとして扱われ、通常は実際のコミットメッセージには含まれません。
なお、次のように-mオプションでメッセージを直接指定した場合、通常はテンプレートを編集するエディタが起動しません。
git commit -m "ログイン画面を修正".gitmessageの設定を解除する方法
テンプレートの使用をやめたい場合は、commit.templateの設定を解除します。
ローカル設定を解除する場合
現在のリポジトリの設定を解除する場合は、次のコマンドを実行します。
git config --local --unset commit.templateグローバル設定を解除する場合
ユーザー全体の設定を解除する場合は、次のコマンドを実行します。
git config --global --unset commit.templateこれにより、指定したスコープのテンプレート設定が削除されます。.gitmessageファイル自体は削除されません。
なお、ローカル設定を解除した後にグローバル設定が残っている場合は、グローバル設定のテンプレートが適用されます。
.gitmessageとGitトレイラーの関係
.gitmessageと一緒に覚えておきたいのが、Gitトレイラー(Git Trailer)です。
Gitトレイラー(Git Trailer)とは、コミットメッセージの末尾に記載する、キー: 値形式の構造化された付加情報です。変更に関連するIssueやレビュー担当者、共同作業者などの情報を、一定の形式で残すために使用します。
例えば、次のようなコミットメッセージがあります。
ログイン画面のエラー表示を修正
認証失敗時のエラー表示を修正した。
Refs: #123
Reviewed-by: Yamada
Co-authored-by: Taro Suzuki <taro.suzuki@example.com>末尾の次の部分がGitトレイラーです。
Refs: #123
Reviewed-by: Yamada
Co-authored-by: Taro Suzuki <taro.suzuki@example.com>| トレイラー | 意味 |
|---|---|
Refs: #123 | 関連するIssueなどを示す |
Reviewed-by: Yamada | レビューを行った人を示すために使われる |
Co-authored-by: Name <email> | 共同作業者を示す |
.gitmessageは、こうしたトレイラーを記載するためのひな形としても利用できます。
# 変更内容を記載
# 変更理由を記載
# トレイラーを使用する場合は、以下を参考に記載
# Refs: #123
# Reviewed-by: Name
# Co-authored-by: Name <email>つまり、「.gitmessageはコミットメッセージのテンプレート、Gitトレイラーはコミットメッセージの末尾に付ける構造化された情報」という違いがあります。
なお、RefsやReviewed-byなどはトレイラーのキーの例です。Gitトレイラーでは、用途に応じてさまざまなキーを使用できます。また、GitHubなどのサービスによって、特定のトレイラーが特別な意味を持つ場合もあります。
Gitトレイラーは、Gitの機能を使って解析・追加・編集することもできます。
.gitmessageをチームで共有する方法
チームで同じテンプレートを使用したい場合は、.gitmessageをリポジトリに含めて管理する方法があります。
例えば、プロジェクトのルートディレクトリに.gitmessageを配置し、Gitで管理します。
my-project/
├── .git/
├── .gitmessage
├── src/
└── README.mdただし、.gitmessageをリポジトリに置いただけでは、他のメンバーのGitに自動的に適用されません。各メンバーがcommit.templateを設定する必要があります。
例えば、プロジェクトのREADMEに次のような設定手順を記載しておくとよいでしょう。
このプロジェクトでは、コミットメッセージの書き方を統一するために`.gitmessage`を使用しています。
## 設定方法
リポジトリをクローンした後、プロジェクトのルートディレクトリで次のコマンドを実行してください。
```
git config --local commit.template .gitmessage
```
## 設定の確認
設定できたか確認する場合は、次のコマンドを実行します。
```
git config --get commit.template
```
次のように表示されれば、設定は完了です。
```text
.gitmessage
```
## コミットする
設定後は、次のコマンドでコミットします。
```
git commit
```
コミットメッセージのテンプレートが表示されるので、変更内容や理由、関連Issueなどを入力してください。これにより、チームで同じテンプレートを共有しながら、それぞれの開発環境で使用できます。
本記事のまとめ
この記事では『.gitmessage』について、以下の内容を説明しました。
- .gitmessageとは、「Gitのコミットメッセージを書くときに使用するテンプレートファイル」のこと
git config --local commit.template .gitmessageなどで設定し、git commit時にひな形を表示できる- ローカル設定は「現在のGitリポジトリのみ」、グローバル設定は「現在のユーザーが使用するリポジトリ全体」に適用される
- 変更内容・変更理由・Issue番号などを記載することで、「コミットメッセージの書き方を統一しやすくなる」
- Gitトレイラーは、
Refs: #123などの「コミットメッセージ末尾に付ける構造化された情報」であり、.gitmessageにひな形を用意できる - テンプレートは入力を補助するものであり、記載内容の強制や自動入力を行う仕組みではない
コミットメッセージは、後から変更履歴を理解するための大切な情報です。.gitmessageを活用して、チームで読みやすいコミット履歴を残せるようにしましょう。
お読みいただきありがとうございました。