문제가 발생한 커밋을 찾아야 하는데 막상 커밋이 수백개라 엄두가 안 나는 상황이 있을 수 있습니다. 깃은 그럴 때 활용할 이진 탐색 명령어를 제공합니다.
git bisect
활용에 앞서 세 가지 사항을 가정하겠습니다.
먼저 현재 위치에서 bisect를 시작합니다.
git bisect start
// status: waiting for both good and bad commits
그리고 git이 요청하는 대로 각 커밋의 상태를 표시합시다.
git bisect bad
// status: waiting for good commit(s), bad commit known
/* 체크아웃시 detached head 상태가 됩니다. */
git checkout b76aa6c
git bisect good
/* 혹은 정상인 커밋을 이미 알고 있다면 이렇게 입력합니다. */
git bisect good b76aa6c
good 커밋과 bad 커밋이 하나씩 정해지면 위 그림과 같은 상태가 됩니다.
git은 good과 bad커밋에 대한 ref참조를 남겼고 그 사이 중간 커밋으로 HEAD를 이동시켜 다시 유저의 판단을 기다리고 있습니다. 계속 진행하다보면...
/*
* <tree-ish>는 커밋, 태그, 브랜치등 커밋을 지칭하는 식별자라고 생각하세요.
* 보다 자세한 정의는... https://git-scm.com/docs/gitrevisions
*/
git bisect start HEAD..<tree-ish>
꼭 good/bad뿐만이 아니라 new/old, 혹은 새로 정의한 다른 용어도 쓸 수 있습니다.
git bisect start --term-old <term-old> --term-new <term-new>
이진탐색을 진행하는동안 git이 제안해준 커밋이 적절하지 않다면 HEAD를 이동시켜 보다 적절한 커밋을 지정할 수 있습니다.
git reset --hard ...
or
git checkout <tree-ish>
혹은 깃이 새로 지정해주도록 skip 명령을 이용하세요
git bisect skip