git bisect로 버그 원인 커밋 찾기 - 이진 탐색 디버깅

문제

어느 시점부터 버그가 생겼는데 커밋이 수백 개라 하나씩 확인하는 건 불가능했다. “분명 지난주까지는 됐는데…“라는 말만 반복하고 있었다.

해결

git bisect는 이진 탐색으로 버그를 만든 커밋을 찾아준다. 1024개 커밋도 10번만 확인하면 된다.

# bisect 시작
git bisect start

# 현재(버그 있음)를 bad로 표시
git bisect bad

# 버그 없던 시점을 good으로 표시
git bisect good abc1234

이제 git이 중간 커밋으로 체크아웃해준다. 테스트하고 결과를 알려주면 된다.

# 이 커밋에서 버그가 있으면
git bisect bad

# 이 커밋에서 버그가 없으면
git bisect good

# 반복하면 원인 커밋을 찾아준다
# "abc5678 is the first bad commit"

테스트 스크립트가 있으면 완전 자동화도 가능하다.

# 스크립트 종료코드 0이면 good, 아니면 bad
git bisect run npm test

# 또는 특정 스크립트
git bisect run ./check-bug.sh

끝나면 원래 브랜치로 돌아간다.

git bisect reset

핵심 포인트

  • 커밋 수가 N개면 최대 log2(N)번만 확인하면 된다. 1000개 커밋도 10번이면 충분하다
  • git bisect run으로 테스트를 자동화하면 아예 손 안 대고 원인을 찾을 수 있다
  • bisect 중에 빌드가 안 되는 커밋을 만나면 git bisect skip으로 건너뛸 수 있다