git bisectで最初のbadコミットの情報を取得する

最近ようやく git bisectの使い方を学んだ。
ただ、git bisectを使っていて少し躓いたのが、コミットをckeckoutする順番によってはbadコミットの1つ手前でbisectが完了することだ。


具体的には、

A(good) → B(good) → X(bad) → Y(bad) → Z(bad)

という履歴の時に、2分探索が

X → B

という順番で行われる*1ため、bisect の完了時に B がチェックアウトされた状態になる。
この時、一応、badコミットを示す「 is the first bad commit」というメッセージがコンソールに表示されるけど、その後にいろいろコマンドを使っているとあっという間にその出力が流れていってしまう。
そうなった後でgit logとかでなんとかbadコミットの情報を取得しようとしても、簡単にbadコミットの情報が得られない*2



今までは出力結果が流されないように別コンソールでgit bisectをやっていたりしたけど、よくよく調べると最初のbadコミットは「bisect/bad」で参照できるようだ。
bisect/badはgit bisect resetするまでは普通の軽量タグと同じように扱える気がする。

badコミットの内容を表示する git show bisect/bad
badコミットにタグを付ける git tag タグ名 bisect/bad
badコミットを別ブランチに切りだしておく git branch ブランチ名 bisect/bad
badコミットのsha1ハッシュを取得する git rev-parse bisect/bad

等々


注意点としては、あくまでbisect/badは「その時点で分かっている最初のbadコミット」を表すという点だ。
なので、上記の例だと、git bisect開始直後はbisect/badはZを指している。
この点と、git bisect resetすると参照できなくなる点に気をつければ、簡単にbadコミットの情報を利用できるようになると思う。

*1:A と Z の中間のコミット(X)からbisectが開始される

*2:git rev-listとかを使えばおそらく取得はできると思うけど、面倒