git bisect

Last-modified: 2019-08-05 (月) 18:31:49

Git には、バグが導入された最初のコミットを二分探索で探す機能 git bisect がある。
これを使うには、まずあらかじめ、バグが導入されていて悪い(bad)コミットひとつと、バグが導入される前の良い(good)コミットひとつを手探りで探しておく。
例えば bad が a0e9c6efa585897f00eb22e67887e5a25482b1b8 で good が v3.16 だとする。
このとき、次のようにセッションを開始する。

git bisect start
git bisect bad a0e9c6efa585897f00eb22e67887e5a25482b1b8
git bisect good v3.16

すると Git は次に試すべきコミットを計算しチェックアウトする。

Bisecting: 31504 revisions left to test after this (roughly 15 steps)
[70e71ca0af244f48a5dcf56dc435243792e3a495] Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-next

我々はこのコミットをコンパイルし、実際に動かしてみるなどして悪い(bad)コミットか良い(good)コミットかを判断する。
ここでは good だったとすると、次のように入力する。

git bisect good

すると Git は次に試すべきコミットを計算しチェックアウトする。

Bisecting: 15752 revisions left to test after this (roughly 14 steps)
[cf7492e933c0df200f8fa46c3684e8bd20890ab2] scripts/gdb: add internal helper and convenience function to retrieve thread_info

我々はまたこのコミットをコンパイルし bad か good か判断する。

git bisect good
Bisecting: 8854 revisions left to test after this (roughly 13 steps)
[80ed156a3d12819a8c839f40f5b6996c4aa117a5] s390/pci: add locking for fmb access

この作業を、最初の bad コミットを判別するまで繰り返す。

...
git bisect bad
Bisecting: 1 revision left to test after this (roughly 1 step)
[394838c96013ba414a24ffe7a2a593a9154daadf] x86/asm/entry/32: Fix user_mode() misuses
git bisect good
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[7486341a98f26857f383aec88ffa10950087c3a1] x86/platform, acpi: Bypass legacy PIC and PIT in ACPI hardware reduced mode
git bisect bad
7486341a98f26857f383aec88ffa10950087c3a1 is the first bad commit
commit 7486341a98f26857f383aec88ffa10950087c3a1
Author: Li, Aubrey <aubrey.li@linux.intel.com>
Date:   Wed Mar 11 16:09:00 2015 +0800
    x86/platform, acpi: Bypass legacy PIC and PIT in ACPI hardware reduced mode
...

現在の状況や最終の状態を見るには git bisect view とする。
git bisect セッションを終了するには git bisect reset とする。