💬

Gemini CLI で Git のコミットメッセージを自動生成する 2025年9月版

に公開

はじめに

この記事は「Gemini CLI で Git のコミットメッセージを自動生成する」の続きというか改良版です。

前の記事の方法だと、git diff 内のテキストによっては、うまく動作しないことがあります。

この記事では、「いったんテキストをファイルへ保存してから、Google の Gemini CLI を活用して、コミットメッセージを作成するというプロセスを自動化」という方法について解説します。

Gemini CLIとは

Gemini CLI は、ターミナルから直接 Gemini モデルを対話的に利用できるコマンドラインツールです。プロンプトを使うことで、テキストの生成、要約、変換などを簡単に行うことができます。

また、パイプ (|) やリダイレクト (<>) と組み合わせることで、他のコマンドの出力を Gemini に渡したり、Gemini の出力を他のコマンドへ入力したりして、自動処理を行うことができます。

この特性を活かせば、「git diff の出力」を「コミットメッセージ」に変換する、といった作業が非常に簡単に実装できます。

前提条件

この記事の手順を試すには、以下のツールがインストールされている必要があります。

ツール名 説明
Git バージョン管理システム
Gemini CLI Google の Gemini API を利用するための CLI ツール

Gemini CLI のインストールや設定がまだの方は、公式のドキュメントを参考にセットアップを完了してください。

手順

基本的な流れは非常にシンプルです。

  1. コミットしたいファイルをステージング (git add)
  2. Gemini CLI へコミットメッセージを生成するように指示 (gemini -p)

ターミナルで、コミットしたい変更があるリポジトリのディレクトリに移動し、コミットしたいファイルをステージングしてから、gemini コマンドを実行します。

プロンプトの内容について、細かい指示をした方が精度があがるので、ここではシェルスクリプトを用意して実行することにします。

設定ファイルについて

Gemini CLI を使うにあたっては、普段使うときと、ターミナルで使うときと、設定を変更したい場合があります。ここでは、ターミナル用の ~/.gemini/settings-cli.json を用意しておき、スクリプト内で通常の ~/.gemini/settings.json を置き換えて使用することにします。

現在の ~/.gemini/settings.json についてバックアップし、内容を確認して調整したものを使用するようにしてください。

筆者の場合は次のような内容にしてあります。

settings-cli.json
{
  "theme": "Default",
  "selectedAuthType": "oauth-personal",
  "hasSeenIdeIntegrationNudge": false,
  "ideMode": false 
}

プロンプト用ファイル

次にプロンプト用ファイル generate_commit_message_v2_prompt.md を作成します。ファイルから差分を取得するために、「コマンド 'git diff --staged' の結果を git_diff.txt から取得すること」としてあります。

generate_commit_message_02_prompt.md
# コミットメッセージの要約作成

## 手順

1. コマンド 'git diff --staged' の結果を git_diff.txt から取得すること
2. 結果から、具体的かつ簡潔で分かりやすいコミットメッセージを作成
3. 作成したコミットメッセージを 180 文字以内に要約

## 作成するコミットメッセージの内容

- Conventional Commits 形式でコミットメッセージを作成すること
- 件名は 50 文字以内とすること
- 日本語とすること
- 作成するコミットメッセージには、変更の要約、目的、影響を盛り込むこと
- 最後に、件名とは別に変更内容の要約を記述すること

## 出力例

feat: hello関数を更新し、goodbye関数を追加

目的: アプリケーションの挨拶機能を拡張し、終了時のメッセージ表示機能を提供します。
影響: 既存のhello関数の出力が変更されますが、機能的な影響はありません。
新しいgoodbye関数が利用可能になります。

---
hello関数のメッセージを「Hello, Gemini!」に変更。
goodbye関数を追加し、「Goodbye, world!」を出力するようにしました。

---
要約: hello関数の出力メッセージを更新し、goodbye関数を新規追加しました。

コマンドの用意

それから generate_commit_message_v2_prompt.md と同じフォルダに次のコマンドを用意します。ここでは generate_commit_message_v2.sh としましょう。

generate_commit_message_v2.sh
#!/bin/bash
# shellcheck disable=SC2006

SCRIPT_DIRNAME=$(dirname "$0")
SCRIPT_DIR=$(cd "${SCRIPT_DIRNAME}" || exit 1; pwd)

TARGET=$(pwd)

if [ -e ~/.gemini/settings-cli.json ]; then
    mv ~/.gemini/settings.json ~/.gemini/settings.json.txt
    cp ~/.gemini/settings-cli.json ~/.gemini/settings.json
fi
cd "${SCRIPT_DIR}" || exit 1

# git diff --staged を git_diff.txt へ保存
git -C "${TARGET}" diff --staged > "${SCRIPT_DIR}/git_diff.txt"

# shellcheck disable=SC2086
PROMPT="@generate_commit_message_v2_prompt.md の内容に従って処理をすること"
gemini \
    --yolo \
    --model gemini-2.5-flash \
    "${PROMPT}"

if [ -e ~/.gemini/settings.json.txt ]; then
    mv ~/.gemini/settings.json.txt ~/.gemini/settings.json
fi

このコマンドを実行する場合は、カレントフォルダを Git リポジトリのルートフォルダにしておく必要があります。

なお、このコマンドを実行すると、スクリプトのあるフォルダと同じフォルダに作業用の git_diff.txt ファイルが作成されます。

また、~/.gemini/settings.json を置き換えたり、戻したりしていて、このファイルの一時退避用に ~/.gemini/settings.json.txt というパスを使っています。そのため、スクリプト実行時に同名のファイルがあると消えてしまいます。このファイルが消えると困る場合は、ファイルを別名にしておくか、スクリプトで使う一時退避用のファイル名を変更することで対応してください。

コマンドの解説

  • $(pwd): スクリプト実行時の Git リポジトリのフォルダのパスを取得
  • git -C "${TARGET}" diff --staged: ステージング済みの変更を対象として、${TARGET} フォルダの変更内容を表示
  • gemini: Gemini CLIを実行
    • --yolo: 自動で処理を進行
    • --model: 使用するモデルの指定
    • --prompt プロンプトの指定

実行例

例えば、以下のような main.py があったとして、これを Git リポジトリへ登録してあったとします。

main.py
def helle():
    print("Hello, world!")

これを次のように変更します。

main.py
def hello():
    print("Hello, Gemini!")

def goodbye():
    print("Goodbye, world!")

変更を Git リポジトリへ反映するために、ステージングします。

git add main.py

差分を確認するには git diff --staged コマンドを実行します。

git diff --staged

実行結果は次のようになります。

diff --git a/main.py b/main.py
index a41e776..798be0f 100644
--- a/main.py
+++ b/main.py
@@ -1,2 +1,6 @@
+
 def hello():
-    print("Hello, world!")
+    print("Hello, Gemini!")
+
+def goodbye():
+    print("Goodbye, world!")

この状態で先ほどのコマンドを実行します。

bash generate_commit_message_v2.sh

すると、Gemini CLI は以下のようなコミットメッセージを生成します。

feat: hello関数を更新し、goodbye関数を追加

目的: アプリケーションの挨拶機能を拡張し、終了時のメッセージ表示機能を提供します。
影響: 既存のhello関数の出力が変更されますが、機能的な影響はありません。
新しいgoodbye関数が利用可能になります。

---
hello関数のメッセージを「Hello, Gemini!」に変更。
goodbye関数を追加し、「Goodbye, world!」を出力するようにしました。

---
要約: hello関数の出力メッセージを更新し、goodbye関数を新規追加しました。

生成されたメッセージを確認し、必要に応じて手直しを加えます。

筆者の場合、VS Code のソース管理を使って GUI でコミットする場合は、複数行のメッセージを採用しています。ターミナルを使って git commit コマンドでコミットする場合は、最初の1行だけ採用しています。

git commit -m "feat: hello関数を更新し、goodbye関数を追加"

要約を採用しても良いでしょう。

git commit -m "hello関数の出力メッセージを更新し、goodbye関数を新規追加しました。"

おわりに

Gemini CLI のバージョンがアップデートされると、オプションが変更されていたり、これまでの挙動と変わっていたり、表示される警告が増えたりします。その都度、スクリプトを調整して使っています。

Discussion