본문 바로가기
C.W.K.
Stream
Lesson 03 of 05 · published

bisect: 버그를 이분 탐색하기

~24 min · bisect, debugging

Level 0추적 전 새싹
0 XP0/47 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

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와 별개로 관리되는 작은 조사 상태야.

Code

수동 bisect — 전형적 세션·bash
# 검색 시작, Git 에 bad / good 끝 알리기:
git bisect start
git bisect bad HEAD
git bisect good v1.4.0

# Git 이 중간점 commit checkout. 테스트:
npm test
# 또는 실제 증상 체커 실행:
./scripts/check-bug.sh

# 결정 + Git 에 말함:
git bisect good       # 또는: git bisect bad

# Git 이 발표할 때까지 반복:
# 'abc1234 is the first bad commit'

# 시작점 복귀:
git bisect reset
자동화 bisect run·bash
# Exit-code 스크립트 제공. 예:
git bisect start HEAD v1.4.0
git bisect run npm test           # 매 단계 full test suite

# 또는 집중 체크:
git bisect run bash -c 'npm run build && grep -q OK dist/output.txt'

# 또는 단일 test 호출:
git bisect run npm test -- search-results.test.js

# 캡처 + replay:
git bisect log > bisect-2026-05-03.log
# ... 며칠 후 재방문:
git bisect replay bisect-2026-05-03.log

External links

Exercise

연습용 repo에 일부러 틀린 상수를 넣는 commit과 관련 없는 commit 여섯 개를 더해 가짜 regression을 만들어. git bisect를 수동으로 실행해 단계마다 good 또는 bad를 정하고 Git이 문제를 넣은 commit을 찾는지 확인해. 이어서 나쁜 상수를 감지하는 한 줄 script를 작성해 git bisect run으로 반복하고 시간과 노력의 차이를 적어봐.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.