Post

git bisect 이진 탐색으로 버그 원인 커밋 찾기

git bisect

버그가 발생했을 때, 어느 커밋이 원인인지 이진 탐색으로 찾을 수 있다.

  1. 먼저 git bisect start 명령으로 이진 탐색을 시작한다.
  2. git bisect bad를 실행하여 현재 커밋에 문제가 있다고 표시를 남긴다.
  3. 문제가 없는 마지막 커밋을 git bisect good <good_commit> 명령으로 표시한다.
1
2
3
4
5
$ git bisect start
$ git bisect bad
$ git bisect good 커밋id
Bisecting: 6 revisions left to test after this
[ecb6e1bc347ccecc5f9350d878ce677feb13d3b2] error handling on repo

Git은 마지막으로 괜찮았던 커밋(good_commit)과 현재 문제가 있는 커밋 중간에 있는 커밋을 Checkout 해준다.

여기에서 해당 이슈가 구현됐는지 테스트해보고 만약 이슈가 있으면 그 중간 커밋 이전으로 범위를 좁히고, 이슈가 없으면 그 중간 커밋 이후로 범위를 좁힌다.

  1. 이슈를 발견하지 못하면 git bisect good으로 이슈가 아직 없음을 알리고 계속 진행한다.
  2. 다시 테스트해보고 이슈가 있으면 git bisect bad로 이슈가 있다고 알린다.
  3. 이제 이슈를 처음 구현한 커밋을 찾았다. git bisect good로 이 문제가 발생한 시점에 무슨 일이 있었는지 확인해본다.
1
2
3
4
5
6
7
8
9
10
$ git bisect good
b047b02ea83310a70fd603dc8cd7a6cd13d15c04 is first bad commit
commit b047b02ea83310a70fd603dc8cd7a6cd13d15c04
Author: PJ Hyett <pjhyett@example.com>
Date:   Tue Jan 27 14:48:32 2009 -0800

    secure this thing

:040000 040000 40ee3e7821b895e52c1695092db9bdc4c61d1730
f24d3c6ebcfc639b1a3814550e62d60b8e68a8e4 M  config

이 때 커밋은 first bad commit 시점으로 checkout 되어있으므로 git bisect reset 명령을 실행시켜서 이진 탐색을 시작하기 전으로 HEAD를 돌려놓는다.

참고사이트

Git 도구 - Git으로 버그 찾기

This post is licensed under CC BY 4.0 by the author.