読者です 読者をやめる 読者になる 読者になる

Tbpgr Blog

Ruby プログラマ tbpgr(てぃーびー) のブログ

git bisect でバグの発生や機能の変更を二分探索で調べる

f:id:tbpg:20160912231556p:plain

git bisect コマンドでバグの発生箇所を二分探索で調べることができます。
本来はデバッグツールとして提供されている機能ですが、例えばある機能が無効化されたのが
いつか、ということも調べることができます。

※既出情報。個人メモとして記事です

git bisect 公式ドキュメント

こちらを参照ください

Git - Git によるデバッグ

サンプル

Crystalのバージョンアップ用CLIツールの「vup」をお題にします。

qiita.com

このコマンドですが、 --major, --minor, --patch の3種類のバージョンアップを
サポートしているのですが、短縮オプションの設定にバグがありました。
-ma, -mi というオプションを設定してあったのですが、
これは想定どおりに動作しません。
そのため id:hkdnet さんのプルリクによって -M, -m に修正してもらったのですが、
修正コミット前までは -ma オプションを受け受け、
修正コミット後では -ma オプションを受け付けません。
この境界を git bisect で検出します。

手順

  • bisect を開始する。
$ git log -10 --oneline                                                                             ⮂
a33347d Doc add MIT License badge
2e220ca Doc change version badge v0.4.0 to v0.4.1 [ci skip]
111c08d bump up version to v0.4.1
6a3bb1a Merge pull request #11 from hkdnet/fix-short-hand-option
b016db0 Change options. -M as major, -m as minor
6f25930 Add rake badge task
dfd16ea <U+1F4DA> Add travis and shard badges
e142069 bump up version 0.4.0
f075cd1 Merge pull request #9 from tbpgr/add-detail-option
6a04444 Support detail option
b3776bf Bump up versoin to 0.3.0 - support dry-run
334cc2b Merge pull request #8 from hkdnet/add-dry-run-option
  • bisect を開始します。 a33347d は bad, 334cc2b は good のコミットハッシュです
$ git bisect start a33347d 334cc2b                                                                  ⮂
Bisecting: 5 revisions left to test after this (roughly 3 steps)
[dfd16ea12f21258b77596ef906a35ecac3fe1f43] 📚 Add travis and shard badges
  • 検証用のプログラムを用意します

コマンドラインツールをデバッグビルドして、 -mi オプション付きで呼び出しています

#!/bin/sh
rake build:debug
./debug/vup -mi
  • bisect run でバグの境界を調べます
git bisect run ./test.sh                                                                 ⮂
running ./test.sh
1.0.0
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[6a3bb1a650930e47e015085e80ff362f76749928] Merge pull request #11 from hkdnet/fix-short-hand-option
running ./test.sh
Invalid option: -mi
Bisecting: 0 revisions left to test after this (roughly 1 step)
[b016db01d33c2f6c2be80048a18a83db9ce72b5d] Change options. -M as major, -m as minor
running ./test.sh
Invalid option: -mi
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[6f25930aa9934a8f0bb2f617567cfe2f66cff8f8] Add rake badge task
running ./test.sh
2.0.0
b016db01d33c2f6c2be80048a18a83db9ce72b5d is the first bad commit
commit b016db01d33c2f6c2be80048a18a83db9ce72b5d
Author: hkdnet <hkdnet@users.noreply.github.com>
Date:   Sat Aug 20 16:31:02 2016 +0900

    Change options. -M as major, -m as minor

:040000 040000 c9420ca22d9ab3eb5abe5ea9a7e82a4d32f8a816 bbe1fe5127f558d23d400487fcb6346b3ceba5b4 M  bin
bisect run success

commit b016db01d33c2f6c2be80048a18a83db9ce72b5d からバグが発生している、という結果がでました。
このコミットは -mi, -ma を -M, -m に変更したコミットなので正しく検出できています。

  • git bisect を終了する
$ git bisect reset