Git Bisect: バグを導入したコミットを特定する
git bisect を使ってコミット履歴を二分探索し、バグやリグレッションを導入した正確なコミットを特定する方法を解説。自動化にも対応しています。
git bisect start && git bisect bad && git bisect good <commit>詳細な説明
git bisect は何をするのか?
git bisect はコミット履歴に対して二分探索を行い、バグを導入した正確なコミットを特定します。コミットを一つずつ確認する代わりに、bisect は各ステップで探索範囲を半分にするため、数千のコミットがあっても非常に効率的です。
仕組み
- どのコミットが「bad」(バグがある)でどれが「good」(バグがない)かを Git に伝える。
- Git が両者の中間のコミットをチェックアウトする。
- そのコミットをテストし、「good」または「bad」とマークする。
- Git が範囲を絞り込み、別の中間点をチェックアウトする。
- 問題のコミットが見つかるまでこれを繰り返す。
具体的な手順
# bisect を開始
git bisect start
# 現在のコミットを bad とマーク
git bisect bad
# 既知の正常なコミットをマーク(例:先週のもの)
git bisect good v2.1.0
# Git が中間点をチェックアウトする。テストして:
git bisect good # バグがない場合
# または
git bisect bad # バグがある場合
# Git が原因を特定するまで繰り返す
# Git は "<hash> is the first bad commit" と表示する
# bisect セッションを終了
git bisect reset
Bisect の自動化
正常なら終了コード 0、異常なら非ゼロを返すテストスクリプトがある場合:
git bisect start
git bisect bad HEAD
git bisect good v2.1.0
git bisect run ./test-script.sh
Git が各中間点でスクリプトを自動実行し、手動介入なしで問題のコミットを見つけます。
ヒント
bisect はコミットが小さくアトミックな場合に最も効果的です。単一のコミットが数千行の変更を含む場合、結果の活用が困難になります。原因を特定したら、git blame や git log と組み合わせてコンテキストを理解しましょう。
ユースケース
直近200コミットのどこかでパフォーマンスの低下が発生した場合に、チームが自動ベンチマークスクリプトと共に git bisect を使い、原因となった正確なコミットを特定する場面で使用します。