본문 바로가기
개발/Git, GitHub

Git Bash - 이분 탐색으로 버그 발생한 commit 찾기

by 피로물든딸기 2022. 7. 31.
반응형

깃허브 데스크탑으로 프로젝트 관리하기 강의 오픈!! (인프런 바로가기)

 

Git / GitHub 전체 링크

 

git bisect start 이분 탐색을 시작
git bisect bad [commit hash] 버그가 발생하는 커밋 표시
git bisect good [commit hash] 버그가 발생하지 않는 커밋 표시
git bisect reset 이분 탐색을 종료

git log --oneline으로 한 줄로 간단히 현재 커밋된 hash들과 내용을 볼 수 있다.

$ git log --oneline
d8321f00 (HEAD -> main, origin/main, origin/HEAD) Update TestScript3.cs
a029141c Revert "ver 1.0"
c348768c ver 1.0
8bc29f54 version 0.0
9bfdfdd0 Merge pull request #12 from substrawberry/push_test
5e4e5443 RR
1f229436 Merge pull request #11 from substrawberry/push_test
0827e67c push test 2
c05d10a6 Merge pull request #10 from substrawberry/push_test
4699472f push test
10069aac aaa
c9682e2b Merge pull request #8 from substrawberry/merge_main_test
924f937f main merge test
aafca4ae Merge pull request #7 from substrawberry/main
7476ce75 main merge

 

그런데 어느 날 버그가 발견되었고, 해당 버그가 어떤 commit에서 부터 발생했는지 모른다고 하자.

커밋을 하나씩 되돌려서 찾을 수도 있지만, 커밋이 많으면 매우 번거롭다.

따라서 이런 경우에는 이분 탐색으로 찾는 것이 빠르다.

 

예를 들어 100개의 커밋이 있고, 50번째 커밋에서도 문제가 발생하고 있다면,

문제가 되는 커밋은 50번째 커밋 이하의 커밋에서 발생한다는 것을 알 수 있다.

 

아래의 커밋을 revert하거나 reset 해서 (또는 파일 하나만 revert 해서) 아래와 같은 정보를 얻었다고 하자.

 

9bfdfdd0 : 문제 있음.

10069aac : 문제 없음.

 

c348768c ver 1.0
8bc29f54 version 0.0
9bfdfdd0 Merge pull request #12 from substrawberry/push_test
5e4e5443 RR
1f229436 Merge pull request #11 from substrawberry/push_test
0827e67c push test 2
c05d10a6 Merge pull request #10 from substrawberry/push_test
4699472f push test
10069aac aaa
c9682e2b Merge pull request #8 from substrawberry/merge_main_test
924f937f main merge test
aafca4ae Merge pull request #7 from substrawberry/main
7476ce75 main merge

 

그리고 이분 탐색(binary search)을 시작한다.

git bisect start

 

bisect가 시작되면 브랜치 정보 옆에 BISECTING 이라는 문구가 추가된다. : (main) → (main|BISECTING)

 

버그가 발생하는 커밋git bisect bad [commit hash]

그렇지 않은 커밋git bisect good [commit hash]로 입력한다.

$ git bisect bad 9bfdfdd0
$ git bisect good 10069aac
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[5e4e5443f449b081e0fab398e57a1c8b3931415a] RR

 

9bfdfdd0 ~ 10069aac 사이에는 5개의 commit이 있으므로 두 번 만에 문제의 커밋을 찾을 수 있다.

따라서 Bisecting: 2 revisions left to test after this (roughly 2 steps) 라는 로그가 나온다.

 

다음은 5개의 commit 중 가운데 커밋인 0827e67crevert 하고 버그 여부를 판단한다.

버그가 존재하지 않는다9bfdfdd0 bad, 0827e67cgood이 되고,

버그가 존재한다 0827e67c bad, 10069aac good으로 다시 진행하면 된다.

 

9bfdfdd0 Merge pull request #12 from substrawberry/push_test
5e4e5443 RR
1f229436 Merge pull request #11 from substrawberry/push_test
0827e67c push test 2
c05d10a6 Merge pull request #10 from substrawberry/push_test
4699472f push test
10069aac aaa

 

버그가 발생되는 commit을 찾았다면 git bisect reset으로 종료한다.

$ git bisect reset
Previous HEAD position was 5e4e5443 RR
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
반응형

댓글