第20回: bisectの基本 — 「いつ壊れたのか」を二分探索で突き止める

章: 第6章: 現場で差がつく補助操作

不具合調査でつらいのは「原因が多すぎる」こと

実務でよくあるのが、「いつから壊れたのかわからない」という状況です。

  • 1週間前は動いていた
  • その間に何十コミットも入っている
  • どの変更が原因か見当がつかない

このとき、最新から順番に全部読むのはかなり大変です。

そこで使えるのが bisect です。

bisect は、正常な地点と異常な地点の間を二分探索して、原因コミットを絞り込むための機能です。

どういう考え方か

やることはシンプルです。

  • 今は壊れているとわかっている地点を bad
  • 以前は正常だったとわかっている地点を good

として、その間のコミットを半分ずつ試していきます。


git bisect start
git bisect bad
git bisect good <正常だったコミットID>

すると Git が候補を1つずつ示してくれるので、その時点で動くか壊れるかを判定して進めます。

なぜ強いのか

10件、20件ならまだしも、100件近い変更の中から原因を探すのは人力だとかなり厳しいです。

bisect を使うと、総当たりではなく半分ずつ候補を削れるので、かなり効率よく絞れます。

つまり bisect の価値は、Gitコマンドを増やすことではなく、調査コストを一気に下げること にあります。

実務で使う場面

  • 不具合がいつ混入したか特定したいとき
  • 再現条件が明確で、正常/異常を判定できるとき
  • 変更量が多く、人力で履歴を追うのが重いとき

特に「テストを回せば壊れているか分かる」状態だと、bisect はかなり強力です。

使う前に必要なこと

bisect は万能ではありません。少なくとも次が必要です。

  • 何をもって正常/異常とするか決まっている
  • あるコミットをチェックしたときに判定できる

ここが曖昧だと、探索の精度が落ちます。

つまり bisect は「Gitの魔法」ではなく、再現できる不具合調査を効率化する手段です。

実務での位置づけ

調査方法 特徴
git log や差分を目視で追う 小規模変更なら有効
bisect で絞る 候補が多いときに強い

原因の見当があるなら logshow で十分なこともあります。ただ、候補が広すぎるときの bisect はかなり頼りになります。

チェックポイント: bisect は「壊れた理由を自動で教える」機能ではなく、「怪しいコミットを効率よく絞り込む」機能です。

まとめ & 次のステップ

  • bisect は正常地点と異常地点の間を二分探索で絞る機能
  • 不具合混入コミットの特定に強い
  • 正常/異常を判定できることが前提になる
  • 候補が多いときほど効果が大きい
  • Gitは履歴管理だけでなく調査の道具としても強力

次回はコンフリクト解消の実践を扱います。 コンフリクトは避けるだけでなく、起きたときにどう落ち着いて処理するかが実務では重要です。

Related Articles