✍️

もう「fix」を卒業。gemini-cliで高品質なコミットメッセージを自動生成するgit command

に公開

3行まとめ

  1. gemini(gemini-cli)を活用し、ステージングされた変更(git diff --cached)から自動でコミットメッセージを生成する自作コマンドを紹介。
  2. 生成されたメッセージを人間がエディタで確認・修正してからコミットする 安全なフローを構築。
  3. git gcommit コマンド一発で呼び出せるようにし、開発体験を爆速化する(ただしAPIのレスポンス待ち時間はある)。

1. はじめに

コミットメッセージを考えるのは、地味にエネルギーを使う作業です。
Conventional Commitsなどのルールに従って記録を残すことは大切ですが、急いでいる時に毎回フォーマットを整えるのは手間がかかります。
そこで、Gemini の力を借りて、ステージングした変更内容から一発でコミットメッセージ案を作成してくれるGitコマンド(git alias)を作成しました。この記事では、そのスクリプトの実装と導入手順を紹介します。

前提条件

  • gemini(gemini-cli): 以下のリポジトリ等のツールがインストールされ、パスが通っていること。
    • 本記事では v0.18.4(公開版、2025-11-28 時点)を例にしています。より新しいプレビューやナイトリービルドが存在することがあります。
    • 本記事ではヘッドレス呼び出しに -p|--prompt を使い、標準出力(stdout)で受け取るシンプルなワークフローを例示します。JSON 出力が必要なら --output-format jsonjq を使う方法も可能です。

https://github.com/google-gemini/gemini-cli

  • git: バージョン 2.x 以上。

2. なぜ gemini で commit メッセージを自動生成するのか?

Conventional Commits(feat: ..., fix: ... といった形式)は、単に履歴を綺麗にするためだけのものではありません。自動リリースノート生成(CHANGELOG.mdの作成)の判断材料としても非常に重要です。
例えば release-please などのツールを導入している場合、コミットメッセージの内容がそのままリリースノートとしてユーザーに公開されます。つまり、丁寧なコミットメッセージを書くことは、丁寧なリリースノートを作ることと同義です。
しかし、毎回コミットのたびに「リリースノートに載せられるレベルの文章」を人間がゼロから考えるのは、非常にコストが高い作業です。急いでいるとつい fix のような雑なメッセージになりがちです。

ここでAIを利用することで、「変更内容の要約」と「フォーマットの適用」 を自動化し、品質を担保しつつ負担を軽減できます。
一方で、AIが生成したメッセージが常に正しいとは限りません。意図しない内容が含まれるリスクもあります。
そこで本記事のアプローチでは、「AIにいきなりコミットさせる」のではなく、「AIにメッセージの下書きを書かせ、エディタで人間が最終決定(レビュー)する」 というフローを採用します。

3. git commandでcommitメッセージを自動生成する方法

3.1 実装:コミットメッセージ自動生成スクリプト

今回使用するスクリプトは以下の通りです。

#!/usr/bin/env bash

set -e
set -o pipefail

# 1. ステージング確認
# 変更がないのにAIに投げると無駄になるため、ここでガードします
if git diff --cached --quiet; then
    echo "🚫 ステージングされた変更がありません。"
    exit 1
fi

echo "🤖 Geminiがコミットメッセージを生成中..."

# 2. プロンプト設定
PROMPT="以下のgit diffから、Conventional Commitsに従ったコミットメッセージを作成してください。タイトルと箇条書きの本文を含め、Markdownのコードブロック(backticks)は含めず、プレーンテキストのみで出力してください。"

# 3. 実行。ステージ差分を標準入力で `gemini` に渡し、その標準出力を `git commit -e -F -` に直接渡します。
git diff --cached | gemini -p "$PROMPT" | git commit -e -F -

ポイント解説

  • git diff --cached: ステージングエリア(git addした内容)のみを対象にします。作業中の未保存ファイルなどは含めません。
  • gemini -p "$PROMPT": ここでAIツールをヘッドレス呼び出ししています。
  • git commit -e -F -:
    • -F -: パイプで渡されたAIの出力をメッセージとして読み込みます。

      • -F (--file): メッセージを記述したファイルを指定するオプションです。
      • -: Unix/Linuxの慣習で、ファイル名の代わりに標準入力を表します。
    • -e: 自動コミットせず、必ずエディタ(VimやEmacsなど)を起動します。これにより、AIの出力を人間が確認・修正する機会を作っています。エディタは GIT_EDITOR 環境変数や git config --global core.editor で指定できます。CIやヘッドレス環境ではエディタが起動しないため、スクリプトで -e をオプション扱いにするなどの配慮が必要です。

3.2 導入手順

このスクリプトを git gcommit として使えるようにセットアップします。

ステップ1: スクリプトの配置

パスの通ったディレクトリ(例: ~/.local/bin)にスクリプトを保存します。

# ディレクトリがない場合は作成
mkdir -p ~/.local/bin

# ファイルを作成(好きなエディタで開いて、上記スクリプトをコピペしてください。PATHが通っている場所が望ましいです)
vi ~/.local/bin/git-gcommit.sh

# 実行権限を付与
chmod +x ~/.local/bin/git-gcommit.sh

ステップ2: Gitエイリアスの登録

Gitからサブコマンドのように呼び出せるよう、エイリアスを設定します。

# オプションA(推奨): スクリプトを PATH に置く場合
git config --global alias.gcommit '!git-gcommit.sh'

# オプションB: 絶対パスを使う場合(ユーザー名を置き換えてください)
git config --global alias.gcommit '!/Users/<yourname>/.local/bin/git-gcommit.sh'

注: ! 付きのエイリアスは git が /bin/sh -c で実行します。~ の展開や shell 固有の構文は期待どおり動作しないことがあるため、絶対パスか PATH 配置を推奨します。

4. 基本的な使い方

以下の手順で利用することができます。

  1. git addでcommitしたい変更ファイルをステージングします。
git add .
  1. git gcommit コマンドを実行し、自作したスクリプトを呼び出します。Geminiが差分を解析し、メッセージを生成します(数十秒程度待ちます)。
git gcommit

prompt

  1. Gitのエディタが自動的に立ち上がり、AIが書いたメッセージが既に入力された状態になります(私の例では vim を使っています)。内容を確認し、必要であれば修正して保存・終了すればコミット完了です。

メッセージを編集する画面

5. 注意点

  • 待ち時間: AIの応答には数秒〜十数秒かかる場合があります。細かい修正を頻繁にコミットするような場面では、手動で書いた方が早いかもしれません。ある程度まとまった変更をコミットする際に特に威力を発揮します。

6. まとめ

  • gemini とGitのオプションを組み合わせることで、「AI提案 → 人間レビュー」という安全かつ高速なコミットが可能になりました。
  • git gcommit コマンド一つで、コミットメッセージ作成の心理的ハードルを下げることができます。ぜひ、ご自身の使いやすいプロンプトにカスタマイズして試してみてください。

Discussion