[GitHub 100일 챌린지] Day 70 - Git Bisect로 버그 찾기
[GitHub 100일 챌린지] Day 70 - Git Bisect로 버그 찾기
100일 챌린지 Day 70 - 이진 탐색으로 버그가 발생한 커밋을 빠르게 찾는 Bisect를 배웁니다.
배울 내용
- Bisect의 이진 탐색 원리
- 수동/자동 Bisect
- 버그 커밋 특정
1. Bisect란?
git bisect는 버그가 처음 발생한 커밋을 이진 탐색으로 찾는 도구입니다. “언제부터 깨졌는지 모르겠지만 예전에는 됐다”는 상황에서 강력합니다.
1
# 100개 커밋 → 7번 테스트로 찾기 (log₂100)
모든 커밋을 하나씩 확인하면 오래 걸립니다. Bisect는 정상 커밋과 버그 커밋 사이의 중간 지점으로 이동하며 범위를 절반씩 줄입니다.
2. 기본 사용법
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 시작
git bisect start
git bisect bad # 현재는 버그
git bisect good v1.0.0 # 1.0은 정상
# Git이 중간 커밋으로 이동
# 테스트 후
git bisect good # 또는 bad
# 반복...
# 버그 커밋 발견!
# 종료
git bisect reset
여기서 가장 중요한 것은 “good”과 “bad”의 기준을 명확히 하는 것입니다.
1
2
good: 로그인 후 대시보드가 열린다
bad: 로그인 후 빈 화면이 나온다
기준이 흐리면 중간 커밋마다 판단이 흔들려 잘못된 커밋을 찾을 수 있습니다.
3. 자동 Bisect
1
2
3
4
5
6
7
8
9
10
11
# 테스트 스크립트
cat > test.sh <<'SCRIPT'
#!/bin/bash
npm test
SCRIPT
chmod +x test.sh
# 자동 실행
git bisect start HEAD v1.0.0
git bisect run ./test.sh
git bisect run은 스크립트의 종료 코드로 good/bad를 판단합니다.
| 종료 코드 | 의미 |
|---|---|
0 | good |
1~127 | bad |
125 | 이 커밋은 건너뛰기 |
예를 들어 특정 테스트 하나만 실행하면 더 빠르게 원인을 찾을 수 있습니다.
1
2
3
4
5
6
7
cat > test-login.sh <<'SCRIPT'
#!/bin/bash
npm test -- login
SCRIPT
chmod +x test-login.sh
git bisect run ./test-login.sh
4. 실전 활용
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 언제부터 로그인이 안 될까?
git bisect start
git bisect bad # 현재
git bisect good v2.0 # 2.0은 정상
# 각 커밋 테스트
npm start
# 브라우저 테스트
git bisect good/bad
# 반복...
# 123abcd is the first bad commit
git bisect reset
버그 커밋을 찾은 뒤에는 바로 수정하지 말고 먼저 내용을 확인합니다.
1
2
git show 123abcd
git show --stat 123abcd
문제 커밋이 정확해 보이면 새 브랜치를 만들어 수정합니다.
1
2
git switch main
git switch -c fix/login-regression
5. Bisect 중 자주 하는 실수
기준 커밋을 잘못 잡는 경우
정상이라고 표시한 커밋이 사실 이미 깨져 있으면 bisect 결과가 틀어집니다. 가능하면 태그나 배포 커밋처럼 확실히 정상인 지점을 사용하세요.
1
2
3
git bisect start
git bisect bad HEAD
git bisect good v2.0.0
테스트가 불안정한 경우
테스트가 랜덤하게 실패하면 bisect가 잘못 판단합니다. 먼저 테스트를 안정화하거나, 수동으로 브라우저에서 확인하는 편이 낫습니다.
reset을 잊는 경우
Bisect가 끝나면 반드시 원래 브랜치로 돌아갑니다.
1
git bisect reset
6. 디버깅 기록 남기기
찾은 결과는 Issue나 PR에 남깁니다.
1
2
3
4
5
6
7
8
9
## 원인 분석
- `git bisect`로 최초 문제 커밋 확인: `123abcd`
- 문제: 로그인 성공 후 redirect 경로가 `/dashboard`에서 `/home`으로 바뀜
- 영향: 기존 라우트와 불일치하여 빈 화면 발생
## 검증
- [ ] 로그인 성공 후 대시보드 이동
- [ ] 로그아웃 후 재로그인
- [ ] 모바일 브라우저 확인
디버깅 기록은 같은 문제가 다시 생겼을 때 가장 빠른 문서가 됩니다.
정리
완료 체크:
- Bisect로 버그 커밋을 찾을 수 있다
- 이진 탐색의 효율을 이해했다
git bisect run으로 자동 테스트를 연결할 수 있다- 문제 커밋을 찾은 뒤 원인 분석을 기록할 수 있다
핵심 요약:
git bisect start/good/bad- 이진 탐색으로 O(log n)
- 자동화 가능
- 끝나면
git bisect reset
Phase 7 완료! 🎉
이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.
