デバッグのためのGit Bisect
`git bisect`を使ってバグを生み出した特定のコミットを効率的に見つけ、デバッグ時間を短縮します。
「デバッグのためのGit Bisect」はCoddyKit上の無料DevOps Bootcampレッスンです。 これはレッスン2/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはDevOps Bootcamp学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 DevOps Bootcampコースには全4レッスンが含まれています。
Gitでバグをすばやく見つける
デバッグは難しいことがあります。バグが発生しても、どの変更が原因なのかわからない場合があります。
git bisectは、バグを導入した正確なコミットを特定するのに役立つ強力なGitコマンドです。二分探索アルゴリズムを使って、数千ものコミットをすばやく絞り込みます。
二分探索の威力
プロジェクトに100個のコミットがあり、最初と最後の間のどこかでバグが発生したとします。1つずつ手作業で確認するのは時間がかかります。
git bisectは、「数当てゲーム」のように動作します。
- バグが存在しなかった「good」コミットをGitに伝えます。
- バグが存在する「bad」コミットをGitに伝えます。
- Gitが範囲のほぼ中央にあるコミットを選び、テストを求めます。
- そのコミットを「good」または「bad」と判定すると、Gitが探索範囲を半分にします。
探索を始めましょう
まず、bisectセッションを開始することをGitに伝える必要があります。次のコマンドで処理を初期化します。
git bisect start
開始後、既知の「bad」コミット(バグが存在するコミット)と、既知の「good」コミット(バグが確実に存在しなかったコミット)を指定します。
多くの場合、「bad」コミットは現在のHEADで、「good」コミットには古いリリースタグや数日前のコミットを指定します。
コミットの境界を指定する
git bisectを開始したら、探索範囲を定義します。
- Badコミット:バグが存在することがわかっているコミットです。
git bisect bad <commit-hash>を使うか、現在のHEADの場合は単にgit bisect badを使います。 - Goodコミット:バグが存在しなかったことがわかっているコミットです。
git bisect good <commit-hash>を使います。
その後、Gitがこの範囲の中央にあるコミットを自動的にチェックアウトします。
テストして絞り込む
goodとbadのコミットを指定すると、Gitは範囲の中央にあるコミットを自動的にチェックアウトします。あなたの役割は、チェックアウトされたコミットのコードをテストすることです。
- バグが存在する場合は、
git bisect badと入力します。 - バグが存在しない場合は、
git bisect goodと入力します。
するとGitは、残った範囲から別の中央のコミットを選びます。Gitが最初の「bad」コミットを見つけるまで、これを繰り返します。
バグが導入された経緯をシミュレートする
スクリプト内の単純な「バグ」を想像してみましょう。小さなエラーが導入されたプロジェクト履歴をシミュレートします。
これが最初の「good」なスクリプトです。
main.sh
#!/bin/bash
echo "Hello from script!"
sum=0
for i in $(seq 1 3); do
sum=$((sum + i))
done
echo "Sum is: $sum"Bisectを手動で進める
後のコミットでループが誤ってseq 1 4に変更され、合計が正しい6ではなく10になったとします。
まず、次のコマンドを実行します。
git bisect start
次に、現在のHEAD(バグが存在する状態)をbadとして指定します。
git bisect bad HEAD
そして、正常に動作することがわかっている古いコミットをgoodとして指定します。
git bisect good <old_good_commit_hash>
Gitがコミットをチェックアウトしながら案内してくれます。./main.shを実行し、合計が6か10かを確認してから、状況に応じてgit bisect goodまたはgit bisect badと入力します。
デバッグプロセスを自動化する
テストが複雑な場合、各コミットを手動でテストするには時間がかかります。git bisect runを使えば、この作業を自動化できます。
次の終了コードを返すスクリプトを用意します。
- コミットがgoodの場合は
0(ゼロ)。 - コミットをスキップする場合は
125。 - コミットがbadの場合は、その他のゼロ以外の値(例:
1)。
Gitはバグが見つかるまで、テスト対象の各コミットでこのスクリプトを実行します。
#!/bin/bash
./main.sh | grep "Sum is: 6"
if [ $? -eq 0 ]; then
exit 0 # Good commit
else
exit 1 # Bad commit
fi探索を終了する
git bisectが最初のbadコミットを正常に特定すると、そのコミットのハッシュとメッセージを表示します。
原因を見つけて問題を理解したら、bisectを開始する前の元の状態にリポジトリを戻すことが重要です。
git bisect reset
このコマンドを実行すると、bisectを開始したときにいたコミットに戻り、一時的なbisectの状態が解除されます。
Bisectの理解度チェック
git bisect startを実行し、現在のHEADをbad、古いコミットをgoodとして指定しました。Gitが範囲の中央にあるコミットをチェックアウトします。
テストを実行したところ、この中央のコミットにはバグが存在しました。
`git bisect`の復習
おめでとうございます。git bisectの使い方を学びました。
- バグを導入した正確なコミットを見つけるための強力なツールです。
- 効率的な二分探索を使用します。
- 「good」(バグなし)と「bad」(バグあり)のコミットを定義します。
git bisect run <script>でテストプロセスを自動化できます。- 探索後は、必ず
git bisect resetを実行して状態を整理してください。
よくある質問
「デバッグのためのGit Bisect」レッスンは無料ですか?
はい。「デバッグのためのGit Bisect」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、DevOps Bootcampコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 DevOps Bootcampコースには全4レッスンが含まれています。
「デバッグのためのGit Bisect」で何を学びますか?
`git bisect`を使ってバグを生み出した特定のコミットを効率的に見つけ、デバッグ時間を短縮します。 ブラウザで直接実行するハンズオンコードでDevOps Bootcampを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
DevOps Bootcampを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのDevOps Bootcampは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン2/4です。
「デバッグのためのGit Bisect」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このDevOps Bootcampレッスンでコードを書いて実行できますか?
はい。すべてのDevOps Bootcampレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- Git Reflogと履歴の復元
- デバッグのためのGit Bisect
- リポジトリのメンテナンスと整理
- git filter-repo で履歴を書き換える