【Git】
生成AI時代のpre-commit
(自己修正のルール化)

生成AIエージェントを使ったコーディングが、少しずつ「実験」から「実務」に近づいてきました。
個人的にも、簡単な修正や補助的な実装をAIに任せる時間が増えています。

その中で、以前よりもはっきり意識するようになったのが pre-commit の存在です。
コードのチェックや検証を、AIエージェントへの「指示」ではなく、「ルール」として強制できることがポイントです。

関連記事

1. pre-commitとは

pre-commit は、Gitでコミットする直前に自動で処理を挟む仕組みです1
「保存する前にチェックする自動フィルター」と捉えると近いかもしれません。

pre-commitとは? コミット前に自動でチェックする仕組み コード編集 pre-commit 自動チェック コミット できること フォーマット自動修正 Lintによるエラー検出 型チェック 秘密情報の混入チェック ⚠ 入る前に止める設計

例えば次のようなことができます。

  • コードフォーマットの自動修正
  • Lint(静的解析)によるエラー検出
  • 型チェック
  • 秘密情報の混入チェック

コミット自体を止められるのも特徴です2
「あとで直す」ではなく、「入る前に止める」設計になっています。

2. 人が書くコードと、AIが書くコード

AIが書くコードは、全体としてはよくできています。
ただし、細かいところを見ると微妙な問題が入り込みやすいです3

  • import の抜けや順序の乱れ
  • 使われていない変数や関数
  • フォーマットの微妙な揺れ
  • 型や戻り値の「それっぽい」誤り

どれも一つ一つは小さな問題です。
しかし、人がレビューするときには、こうしたノイズが意外と集中力を削ります。

2.1. なぜ生成AI時代にpre-commitが効くのか

そこで、pre-commitでフォーマットやLintを通しておくと、レビューは「設計」や「意図」に集中できます。

また、pre-commitは、機械的で明確な失敗理由を返します。
「未使用の変数があります」「型が合っていません」といった具合です。

生成AIは、このような明確なエラーを元に再修正するのが得意です4
結果として、AIが自己修正しやすい環境が整います。

もちろん、AGENTS.mdなどのプロンプトでチェックを指示することもできますが、AIのコンテクストが圧迫されると無視されることが少なくありません。
pre-commitは、「仕組み」としてチェックを強制し、クリアしなければコードをコミットできないようにできます。

2.2. 情報漏洩への最後のブレーキ

最近は、AIエージェントに「修正 → コミット」まで任せるケースも出てきました5
この場合、pre-commitは事実上の最後のブレーキになります。

  • ビルドできないコード
  • 秘密情報を含むファイル
  • 明らかに壊れた差分

こうしたものを、履歴に残さずに済みます。
個人的には、ここが一番大きな価値だと捉えています。

3. 重くしすぎると逆効果

pre-commitにテストやビルドを全部入れると、動作が重くなります6
AIの試行回数が減り、テンポが悪くなりました。

pre-commitは「軽く・早く」が前提だと思います。
重たい検証はCIに任せた方がうまく回りました7

3.1. ルールは段階的に増やす方が楽

最初から厳しいチェックを入れると、失敗が多発します。
AIも人も疲れます。

まずはフォーマットと基本的なLintだけ。
慣れてきたら型やセキュリティチェックを追加する。
このくらいがちょうどよいと感じています。

4. pre-commitは「AIと人の境界」に置く道具

生成AIがコードを書く時代になっても、
最終的に責任を持つのは人間です。

pre-commitは、その境界に置く道具だと考えています。
AIの自由度を保ちつつ、人間の負担を減らす。
完全ではありませんが、現実的な落としどころです。

しばらくは、この形を前提に試行錯誤が続きそうです。

  1. pre-commitは、Git Hooksを使ってコミット前などのタイミングで自動的にチェック処理を実行できるフレームワークです。.pre-commit-config.yamlファイルで設定を管理し、複数の言語やツールに対応しています。 – Git Pre-Commitフックによるコード検査の自動化
  2. pre-commitフックが0以外のステータスで終了した場合、Gitはコミットを中止し、問題を修正してから再度コミットする機会を与えます。これにより品質基準を満たさないコードが履歴に入るのを防ぎます。 – gitのpre-commitでコミット前のチェックを行う方法|Improver Tech Blog
  3. 生成AIは確率的にコードを生成する「非決定論的」な性質を持つため、同じプロンプトでも毎回微妙に異なる出力をします。また、セキュリティのベストプラクティスに従わないコードや、適切なエラーハンドリングが欠けたコードを生成する可能性があります。 – 生成AIコードの品質を決定論的に自動担保するワークフローのご紹介
  4. AIは明確で構造化されたフィードバック(エラーメッセージ、型チェック結果など)を元に自己修正を行うことが得意です。pre-commitによる機械的なチェックは、AIが理解しやすい形式でエラーを返すため、効率的な修正サイクルを実現します。 – 【イベントレポート】コード品質はどうなる?生成AIとの最適な協働とは?〜コード×AI疑問解消会〜 – Findy Engineer Lab
  5. MicrosoftのSatya Nadella氏は20-30%のMicrosoftのコードがAIによって書かれていると発言し、MetaのMark Zuckerberg氏は将来的に50%の開発がAIによってなされる可能性を示唆しています。このようなAI主導の開発環境では、自動的な品質担保の仕組みがより重要になります。 – 生成AIコードの品質を決定論的に自動担保するワークフローのご紹介
  6. pre-commitフックでは、軽量で高速なチェック(フォーマット、Lint、基本的な型チェック)に限定することが推奨されます。全てのテストコードを実行すると開発体験を損ない、かえって生産性が下がる可能性があります。重いチェックはCI/CDパイプラインで実行するのがベストプラクティスです。 – pre-commitでGitのフックを使いこなす – とことんDevOps
  7. Sansan社の事例では、pre-commitで基本的なチェック(フォーマット、Lint)を行い、重い処理はCI環境で実行する段階的なアプローチを採用しています。この方法により、ローカルでの開発速度を維持しながら品質を担保できています。 – 【後編】24新卒開発研修で新しいツールを導入した話 〜pre-commit の導入方法と使い方など〜 – Sansan Tech Blog