git bisect
二分探索でバグが混入したコミットを特定します。大量のコミット履歴から手作業で原因を探す手間を大幅に減らせます。
git bisect <subcommand> [options] git bisect は、「以前は動いていたのに、今は動かない」というバグについて、その原因となったコミットを二分探索で特定するコマンドです。手作業で1コミットずつ確認するよりもはるかに少ない試行回数で原因にたどり着けます。
基本的な考え方
良好(good) 不良(bad)
A ─ B ─ C ─ D ─ E ─ F ─ G ─ H ─ I ─ J ─ K
↑
この間のどこかでバグが混入した
git bisect は good と bad の間を半分に区切って checkout し、その地点で動作確認 → 結果を good/bad として報告、を繰り返します。10コミットの範囲なら最大でも4回程度の確認で原因コミットに到達できます。
基本的な使い方(手動確認)
# bisect セッションを開始
git bisect start
# 現在のコミット(HEAD)にバグがあることを報告
git bisect bad
# バグがなかったことがわかっている過去のコミット・タグを報告
git bisect good v1.0.0
Bisecting: 5 revisions left to test after this (roughly 3 steps)
[e4f5g6h...] コミットメッセージ
Git が自動的に中間のコミットへ checkout します。そのコミットの状態で動作確認を行い、結果を報告します。
# 動作確認した結果、バグがなければ
git bisect good
# バグがあれば
git bisect bad
これを繰り返すと、最終的に以下のように原因コミットが表示されます。
a1b2c3d4e5f6789... is the first bad commit
commit a1b2c3d4e5f6789...
Author: Taro Yamada <[email protected]>
Date: Thu Jun 12 14:30:00 2025 +0900
ログイン処理のバリデーションを変更
セッションを終了する
# bisect 開始前のブランチ・コミットに戻る
git bisect reset
reset を忘れると、作業ツリーが bisect 中の中間コミットにチェックアウトされたままになるので注意してください。
テストスクリプトで自動化する
毎回手動で動作確認するのではなく、テストスクリプトの終了コードで判定を自動化できます。
git bisect start
git bisect bad HEAD
git bisect good v1.0.0
# 終了コード 0 = good、それ以外 = bad として自動判定
git bisect run npm test
running npm test
...
a1b2c3d4e5f6789... is the first bad commit
run を使うと、良好・不良の判定から中間コミットへの移動まですべて自動化され、1コマンドで原因コミットが特定できます。CI で使っているテストコマンドをそのまま指定できる場合、この方法が最も効率的です。
ヒント
git bisect good/git bisect badに引数を省略すると、現在チェックアウトされているコミットが対象になります。git bisect runに渡すスクリプトは、ビルドが必要なプロジェクトであればビルドコマンドも含めておくと安全です。- bisect の途中経過は
git bisect logで確認でき、git bisect replayで再実行することもできます。