git bisect コマンドでバグの発生箇所を二分探索で調べることができます。
本来はデバッグツールとして提供されている機能ですが、例えばある機能が無効化されたのが
いつか、ということも調べることができます。
※既出情報。個人メモとして記事です
git bisect 公式ドキュメント
こちらを参照ください
サンプル
Crystalのバージョンアップ用CLIツールの「vup」をお題にします。
このコマンドですが、 --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