기타/Git

[git] Git Bisect: 깃의 디버깅 도구

닉네임없음ㅎ 2024. 11. 20. 07:05

개발을 진행하다보면, 어느순간 갑자기 코드에 버그가 생겨난 경우가 있다.
이런 경우 버그가 생긴 시점을 찾아야하는데, 수많은 커밋중에서 버그가 발생한 정확한 지점을 찾는것은 쉬운일이 아니다..

이럴때 유용한 git bisect라는 명령어가 있다 ! 

1. Git Bisect란?
이진 탐색 알고리즘을 이용해서 버그가 발생한 커밋을 찾아내는 git 명령어다.
대략적으로 설정하면
첫 번째로 의심되는 지점의 커밋을 지정하면, git bisect는 가장 최근의 커밋에서부터 사용자가 지정한 커밋, 두 지점 사이의 커밋들을 이진 탐색 방식으로 점검하면서 문제를 일으킨 지점을 찾는 것이다.

2. 기본 명령어

# Bisect 시작
git bisect start


# 현재 커밋을 bad로 지정
git bisect bad


# 문제 없는 이전 커밋을 지정 (커밋 해시 필요)
git bisect good <commit-hash>


# Git이 중간 커밋으로 체크아웃합니다. 테스트 후:
# 문제가 있으면
git bisect bad


# 문제가 없으면
git bisect good

 


★ ★실습 ★ ★

이렇게 commit들이 있을때 

의심되는지점이 commit6이라고 가정한다 

 

1. 터미널창에서 bisect 시작을 알림

 git bisect start

 

이렇게 good또는 bad 를 해달라는 상태로 변경됨. 

 

 

2. 현재 master 브랜치는 bad 상태임을 알려줌

git bisect bad

 

 

 

3. 의심 지점으로 이동 

 git checkout 커밋해쉬

오류발생 시작이 의심되는 커밋의 해쉬로 이동한다

(commit 6이 의심되는 것으로 가정하여 commit 6으로 이동) 

HEAD의 위치가 commit 6으로 간것을 볼 수 있다. 

이 상태에서 오류가 나는 코드를 실행해본다. 

 

 

4. good/ bad를 구분해줌 

 git bisect good

commit 6에서는 오류가 발생하지 않으므로 good 

 

 

5. 커밋 이동 (bisect가 자동으로 이동시켜줌)

그럼 HEAD가 6과 첫 지점의 중간인 10으로 이동한다 (이진탐색을 하는거임)

 

그럼 commit10의 상태에서 또 코드를 실행해본다

 

 

6. good / bad 입력

git bisect bad

근데 에러가 발생했다 !  이번에 bad 입력

 

 

그럼 에러발생 시작 의심지점은 commit 6과 commit 10사이로 좁혀진다.

그리고 6과 10의 중간인 8로 이동하게됨. 

여기서 다시 코드를 실행해보았을때 오류가 나지않는다면 

git bisect good

 

그러면 HEAD는 9로 옮겨짐

 

9에서 다시 코드를 실행해봄 ! 

오류가 난다 ! 

git bisect bad

 

그럼 이렇게 최종적으로 어떤 커밋에서 오류가 시작되었는지 찾을수 있게 되는 거임. 

그리고 해당 커밋에서 어떤 파일이 변경되었는지도 확인할 수 있다.