Git Bisect の概要
「git bisect」は最初は少し混乱するかもしれません。それが何をするのかを理解すれば、それは簡単です。
「git bisect」の典型的なシナリオは次のとおりです。バグが発見されました。どのリビジョンがバグを導入したかを調べたいとします。バグが最新のリビジョンに存在することはわかっていますが、それは以前のリビジョンで導入されました。バグが存在するかどうかを確認する方法が必要になります。これは、自動テストの場合もあれば、手動で実行するテストの場合もあります。
始めましょう。ブランチの最新リビジョンから始めて、次を発行します。
git bisect start
そして、現在のバージョンが悪いことがわかっていることを git に伝えます。
git bisect bad
次に、適切な回転数を見つける必要があります。バグがないほど古いものを 1 つ確認します。32 回転前が良いと考える場合は、次のようになります。
git checkout HEAD~32
テストを実行して、バグがあるかどうかを確認します。バグがある場合は、さらに古いリビジョンを試す必要があります (「git checkout HEAD~32」を再度発行するだけです)。バグのないリビジョンに着地するとすぐに、次のようになります。
git bisect good
これは、現在のバージョンが適切であることを git に伝えます。Git はすぐに良いリビジョンと悪いリビジョンの間のリビジョンをチェックアウトします。次のような出力が表示されます。
$ git bisect good
Bisecting: 7 revisions left to test after this (roughly 3 steps)
[909ba8cd7698720d00b2d10738f6d970a8955be4] Added convenience delegators to Cache
テストを実行し、テストの結果に応じて、次のいずれかのコマンドを発行します。
git bisect good # the test passed
git bisect bad # the test failed
git bisect skip # we can't run the test on this rev for some reason
(doesn't compile, etc.)
Git はさまざまなリビジョンに変更され続け、良い、悪い、またはスキップし続けるでしょう。git が最終的にどのリビジョンがすべての問題を引き起こしたかを突き止めると、次のような結果が得られます。
b25ab3cee963f4738264c9c9b5a8d1a344a94623 is the first bad commit
commit b25ab3cee963f4738264c9c9b5a8d1a344a94623
Author: Wayne Conrad <wconrad@yagni.com>
Date: Fri Dec 25 18:20:54 2009 -0700
More tests and refactoring
:040000 040000 6ff7502d5828598af55c7517fd9626ba019b16aa 39f346cb5a289cdb0955fcbba552f40e704b7e65 M routecalc
そして、最初の悪いコミットで、現在のリビジョンが表示されます。
git bisect を「手を離して」実行する
テストが自動の場合、git にすべての作業を任せることができます。上記を開始するために行ったすべてのことを行います。
git bisect start
git bisect bad
git checkout HEAD~32 # or however far back it takes to find a good rev
git bisect good
そして今、魔法のために。必要なのは、成功の場合は終了コード「0」、失敗の場合は 1 (たとえば) を返すテスト プログラムだけです。テストについて git に伝えます。
git bisect run tests/mytest.rb
Git はテストを実行し、結果を使用して "git bisect good" または "git bisect bad" を自動的に実行します。バグを導入したコミットが見つかるまで、それを続けます。あなたがしなければならないのは、座って見ることだけです。
終わったら
完了したら、次を発行します。
git bisect reset
Git は、開始した場所に戻します。