.gitmessageとは?コミットメッセージをテンプレート化する方法を解説!

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 --oneline
a1b2c3d ログイン画面のエラー表示を修正
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トレイラーはコミットメッセージの末尾に付ける構造化された情報」という違いがあります。

なお、RefsReviewed-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を活用して、チームで読みやすいコミット履歴を残せるようにしましょう。

お読みいただきありがとうございました。

スポンサーリンク