노트

git bisect로 원인 커밋 찾기

Git Bisect

개발 문화#debugging#git · 연결된 개념 8개

쉽게 말하면

git bisect는 '어제까진 멀쩡했는데' 싶을 때 하는 스무고개예요. 정상이던 때와 고장 난 지금 사이 한가운데를 확인하고 절반씩 버리다 보면, 커밋이 천 개여도 열 번쯤이면 범인이 나와요.

비유가 깨지는 곳 범인 커밋이 거대하면 스무고개가 끝나도 그 안에서 다시 좁혀야 해요. 커밋이 작고 각 커밋이 빌드되는 상태여야 원인 커밋이 곧 원인 변경이 돼요.

"예전엔 됐는데 지금은 안 된다"면 그 사이 어딘가의 커밋이 원인이다. 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

연결된 개념

이 노트를 가리키는 문서

뜻이 가까운 노트

  • kubectl 디버깅 치트시트

    kubectl은 쿠버네티스 클러스터를 조회·조작하는 CLI(Command-Line Interface)다. 앱 개발자가 가장 자주 쓰는 건 "내 Pod가 떠 있나, 왜 죽었나"를 확인하는 명령들이다.

  • GitOps

    GitOps는 "환경이 어떤 상태여야 하는가"를 전부 git 저장소에 선언해 두고, git에 적힌 것을 유일한 진실(single source of truth)로 삼아 실제 환경을 맞추는 운영 방식이다. 서버에 직접 손대지 않고, 바꾸고 싶으면 git을 고친다.

  • 여러 저장소 합치기

    따로 관리하던 Git 저장소를 하나로 합칠 때, 히스토리를 버리지 않고 옮기는 방법이 두 가지 있다. 저장소 루트끼리 그대로 합치거나(unrelated histories 머지), 한쪽을 다른 쪽의 하위 폴더로 넣는다(subtree). 모노레포로 옮길 때 자주 쓴다.

  • 정리(Tidying)

    동작을 바꾸지 않는 아주 작은 구조 변경. 켄트 벡은 리팩터링이라는 말이 "기능 개발 중간의 긴 공사"처럼 쓰이며 동작 보존 원칙이 흐려지자, 더 작고 겁나지 않는 단위를 정리라는 이름으로 따로 불렀다. refactoring의 부분집합이다.

  • 테스트 냄새

    테스트 코드나 테스트 습관에서 나는, 더 깊은 문제를 알리는 신호. 제라드 메스자로스의 xUnit 테스트 패턴 정리가 이름을 붙였다.

보기 옵션