bisect는 이력을 통과하는 이분 탐색이야
버전 1.4에서는 되던 기능이 2.0에서 망가졌고 사이에 commit이 200개 있다고 해보자. 수동으로 하나씩 찾는 건 고역이야. git bisect는 중간 commit을 checkout하고 네가 good 또는 bad라고 답할 때마다 후보를 절반으로 줄여. log₂(200)은 약 7이므로 test 일곱 번 정도면 regression을 처음 만든 commit을 찾을 수 있어.
git bisect start로 시작하고 망가진 commit에는 git bisect bad HEAD 또는 git bisect bad, 작동한다고 아는 commit은 git bisect good v1.4로 표시해. Git이 중간점을 checkout하면 빌드하고 test한 뒤 git bisect good 또는 git bisect bad라고 답해. 첫 bad commit을 발표할 때까지 반복하고 git bisect reset으로 원래 branch에 돌아와.
git bisect run <script>로 자동화할 수도 있어. good이면 exit 0, bad이면 non-zero를 내는 script를 주면 돼. 보통 test 명령이나 grep -q "expected output" log.txt 같은 집중 check를 써. Git이 각 중간점에서 알아서 실행하므로 commit이 수백 개이고 빌드가 느려 몇 시간이 걸려도 그동안 사람이 붙어 있을 필요는 없어.
특정 checkpoint가 broken build나 missing dependency 때문에 test할 수 없다면 git bisect skip으로 다른 후보를 고르게 해. 또 git bisect log > my-bisect.log로 판단을 저장하고 git bisect replay my-bisect.log로 나중에 재생할 수 있어. bisect는 현재 branch와 별개로 관리되는 작은 조사 상태야.