"예전엔 됐는데 지금은 안 된다"면 그 사이 어딘가의 커밋이 원인이다. git bisect는 정상인 커밋과 문제 있는 커밋 사이를 이진 탐색해 처음 문제가 생긴 커밋을 찾아 준다. 커밋이 1000개여도 열 번 정도 확인하면 된다.
손으로 하기
git bisect start
git bisect bad # 지금(HEAD)은 문제가 있다
git bisect good v1.4.0 # 이 시점은 정상이었다
# git이 중간 커밋을 체크아웃한다. 확인하고 결과를 알려 준다
git bisect good # 또는 git bisect bad
# ... 반복하면 "xxxx is the first bad commit"이 나온다
git bisect reset # 원래 브랜치로 돌아간다빌드가 안 되는 등 판단할 수 없는 커밋은 git bisect skip으로 건너뛴다.
자동으로 하기
재현 스크립트가 있으면 전부 맡길 수 있다. 스크립트가 0으로 끝나면 good, 1~127(125 제외)이면 bad, 125면 skip으로 처리한다.
git bisect start HEAD v1.4.0
git bisect run npm test -- src/cart.test.ts재현을 빠르고 확실하게 만들어 두는 것이 먼저다 → 최소 재현
잘 쓰려면
- 커밋이 작고 각 커밋이 빌드되는 상태여야 원인 커밋이 곧 원인 변경이 된다 → 커밋 메시지와 원자적 커밋, 인터랙티브 리베이스로 커밋 정리
- 거대한 커밋 하나가 범인으로 나오면 그 안에서 다시 좁혀야 한다
디버깅 흐름에서는 "잘 되는 경우와 안 되는 경우의 차이 찾기"에 해당한다 → 디버깅 문제 정의 5단계
출처: git-bisect 문서 · Bisect run