Git bisect : 코드에서 버그를 식별하는 방법은 무엇입니까?



git bisect에 대한이 기사에서는 'git bisect'명령이 바이너리 검색 알고리즘을 사용하여 버그를 발생시키는 첫 번째 잘못된 커밋을 감지하는 데 어떻게 도움이되는지 알아 봅니다.

내 코드는 어제까지 잘 작동했지만 최근 원격 저장소에서 가져온 코드가 코드를 깨뜨릴 때까지는 작동하지 않았습니다 !!!

비슷한 상황에 있고 모르는 경우 어떤 변화 코드를 깨다 또는 WHO 많은 기여자 중에서 소유버그 / 기능 , 그러면 git bisect가 탈출구입니다. 따라서 git bisect에 대한이 기사에서는 'git bisect‘명령이 온다 이진 검색 알고리즘을 사용하여 버그를 유발하는 첫 번째 잘못된 커밋을 감지하는 데 도움이됩니다.

이 기사에서 다루는 주제는 다음과 같습니다.





왜 git bisect를 사용합니까?

모든 사소한 변경에 대해 많은 커밋을 만드는 경향이 있다는 사실에는 의심의 여지가 없습니다. . 이러한 시나리오에서 코드 디버깅은 작업 코드를 테스트하고 버그를 감지하기 위해 수동으로 프로젝트 스냅 샷의 모든 단일 개정으로 돌아 가야하므로 지루한 작업이됩니다. 이제이게 더 복잡한 리드 포인트없이 검사 할 다른 사람의 작업이있을 때 각자 자신의 실수를 정리해달라고 요청하는 것도 그다지 타당하지 않은 것 같습니다.
그 과정에서 프로세스에서 여러 '기능'(또는 핫픽스) 분기를 생성 및 폐기하여 기본 개발 라인에서 벗어나 시간과 노력을 낭비하게 될 수도 있습니다.



따라서 이러한 시나리오를 피하기 위해git bisect잘못된 프로젝트 개정 (또는 스냅 샷)을 찾아 결국에는자식 되돌리기명령.

'git bisect'는 어떻게 검색합니까?



이 명령 이등분 (분할) 당신의 역사를 좋은 그리고 나쁜 범하다 범위. 그것은 당신의 흐름 계획 상태미드 레인지 범하다 스냅 사진. 그런 다음 git bisect 명령이 모든 커밋 ID 이 범위 사이 일시 중지 각 스냅 샷에서 코드 테스트 . 버그가 있으면 커밋을 다음과 같이 선언합니다. 나쁜, 그렇지 않다면 좋은 검색이 끝나지 않는 한.

통사론

git bisect

git bisect를 더 잘 이해하기 위해 자동차에서 사용할 간단한 내비게이션 앱의 코드를 개발하는 프로젝트를 만들어 보겠습니다.

초기 프로젝트 설정

자동차에서 사용할 간단한 내비게이션 앱의 코드를 개발하는 프로젝트를 만들려면 다음 단계를 따르세요.

1 단계: $ HOME 폴더에 새 디렉토리를 만듭니다.

cd $ HOME mkdir my_nav_app

2 단계: 새 디렉토리로 이동하십시오.

cd $ my_nav_app

3 단계 : 복제하여 내 GitHub 페이지에서 프로젝트를 다운로드합니다.

git clone https://github.com/divyabhushan/my_nav_app.git

이제 다음 명령으로 인쇄 된 프로젝트 디렉토리 및 파일 레이아웃을 이해하겠습니다.ls -lTR

소스 코드 레이아웃-Git Bisect-Edureka

다음으로이 코드를 생성하기 위해 작성한 커밋을보기 위해 프로젝트 히스토리 저널을 보겠습니다.

예를 들어 간단한 git log 명령은 히스토리를 자세히 인쇄하지만, 나는 히스토리를 예쁜 형식으로 지정하고 사용자 정의하는 것을 좋아합니다. 따라서 우리에게 별칭 이름 설정 –‘hist’ 사용하여 자식 별칭 아래와 같이 명령 :

git alias.hist 'log --pretty = format :'% C (노란색) % h % Creset % ad | % C (녹색) % s % Creset % C (빨간색) % d % Creset % C (파란색) [% an] '--graph --decorate --date = short'

이제이 버그 수정 기능을 별도의 브랜치에서 수행하여 '마스터'브랜치의 주요 개발을 방해하지 않도록하겠습니다. 이를 수행하려면 아래 명령 세트를 따르십시오.

  • 'dev'브랜치 생성 : [마스터] $git branch dev
  • 브랜치 'dev'로 전환 : $git checkout dev
  • 기록 로그를 나열합니다. [개발] $히스 토로 이동[참고 : 여기서 사용 된‘별칭’명령]

또한 내 스크립트가 예상되는 테스트 케이스 결과와 잘 작동하는지 알고있는 마지막으로 알려진 양호한 커밋을 강조했습니다.이 커밋 스냅 샷은 다음과 같습니다. 태그 됨 v1.0으로.

이제 마지막으로 좋은 커밋을 알았으니이 글에서 'git bisect'에 대한 기사를 진행하여 애플리케이션을 테스트 해 보겠습니다.

응용 프로그램 테스트

다음으로 스크립트 실행 – $./scripts/myApplication.sh[처음 테스트]



분명히 내 현재 프로젝트 상태는 오류 , 그리고이 변경 사항을 도입 한 커밋에서 어떤 변경 사항을 적용했는지 잘 모르겠습니다. 따라서 다음으로 git bisect에 대한이 기사에서 잘못된 커밋을 식별하는 방법을 살펴 보겠습니다.

잘못된 커밋 식별

잘못된 커밋 검사를 시작하려면 다음 단계를 따르십시오.

  • bisect 명령 시작 :자식 bisect 시작
  • 잘못된 커밋 ID를 언급합니다. git bisect bad HEAD또는git bisect c5b3ca8
  • last-known-good-commit ID를 언급합니다. git bisect good v1.0또는자식 bisect 93859d8

이것은 커밋 ID를 가져 오는 좋은 커밋과 나쁜 커밋 사이의 대략 중간에 커밋 히스토리 범위를 양분합니다. f61a7e8

따라서 명령은이 커밋 ID에있는 프로젝트 버전을 체크 아웃했습니다. 이제 애플리케이션을 다시 테스트 해 보겠습니다.

애플리케이션 실행 명령 : $./scripts/myApplication.sh[두 번째 테스트]


신청 이후 통과 이 커밋에서이 커밋은 확실히 나쁜 커밋이 아닙니다. 따라서 다음으로 bisect 명령에 다음과 같이 알려야합니다. – $git bisect good


이제 다음과 같이 검색 결과를 범위의 전반부로 더욱 좁 힙니다.


응용 프로그램을 다시 테스트하십시오. – 명령 : $./scripts/myApplication.sh[세 번째 테스트]


따라서 위와 같은 오류가 표시되므로 이것은 잘못된 커밋입니다.

bisect 명령에 알리고 $ 실행git bisect bad


그러면 검색 범위가 더 좁아지고 파란색으로 둘러싸인 마지막 중간 개정판이 표시됩니다. a6ac769

따라서 동일한 명령을 사용하여 마지막으로 애플리케이션을 테스트합니다. $./scripts/myApplication.sh[네 번째 테스트]

이제 응용 프로그램이 다시 실패 했으므로 여전히 잘못된 커밋입니다. 따라서 다음 명령을 실행하십시오.

다음 명령을 실행하십시오. git bisect bad

잘못된 커밋 발견

이것은 마지막으로 남은 유일한 커밋을 마칩니다.


그래서 당신은 이것이 코드가 깨진 곳이라는 것을 알고 있습니다. 다음은?

버그가있는 파일 이해

이 경우 출력은 사용자에게 최소한의 정보를 제공합니다. 커밋 ID , 저자 이름 , 그리고 작성일 와 함께 커밋 메시지 그리고 통로 수정되었습니다.

추가로 디버그하려면 다음을 수행해야합니다. 읽다 그만큼 커밋 ID 개체 .

명령: git show a6ac76994b3f6c7519204f910fc787b7928cf8ef

이것은 커밋 객체를 읽고 로그 메시지와 텍스트 diff를 인쇄합니다.

'git blame'명령을 사용하여 작성자가 각 행을 변경 한 방법과 커밋을 분석 할 수도 있습니다. 명령을 다음과 같이 실행하십시오.자식 비난 코드 / develop_nav.sh

검색 중지

검색을 중지하려면 다음 명령을 사용하십시오.

명령: 자식 bisect 재설정


따라서 이분법 프로세스가 중지되고 검색을 시작한 분기로 돌아갑니다. 이제 다음 단계는 코드를 수정하거나 디버그하는 것입니다.

코드를 수정 / 디버그하는 방법?

글쎄, 처음에 버그를 가져온 커밋을 식별 했으므로 프로젝트의 현재 상태를 수정하기 위해 수행 할 수있는 몇 가지 해결 방법이 있습니다.
그러나 커밋을 변경하는 경우 공유 저장소 하는 것이 가장 좋습니다 돌아가는 것 자식 되돌리기 ‘명령.

직무: 언급 된 잘못된 커밋에 의해 수행 된 변경 사항을 되돌립니다.

명령: 자식 복귀 a6ac769

결과적으로이 커밋으로 변경 한 사항을 되 돌리면 다음 두 가지 작업이 수행됩니다.

  • 마지막으로 추가 된 3 줄 (녹색으로 표시)을 삭제하고 삭제 된 줄 (빨간색으로 표시)을 다시 추가했습니다. (a6ac769의 반전)
  • 되돌리기 메시지 정보로 추가 커밋을 생성했습니다.

'Revert 명령을 사용하면 원래 커밋에서 되 돌린 변경 사항을 더 쉽게 추적 할 수 있습니다.'

사용 '보여 주다' 객체 ID를 읽으려면 다시 명령하십시오.

명령: 자식 쇼 801f029

자바에서 숫자를 거듭 제곱하기

이제 계속해서 애플리케이션을 테스트하십시오. 제대로 실행됩니다.

명령: $./scripts/myApplication.sh

반대로, 기록에서 잘못된 커밋을 제거하려면 다음을 수행하십시오.

  • 자식 재설정 '명령에 '--단단한”옵션 (공유 저장소에서는 권장되지 않음).

  • ‘를 사용하여 단일 파일의 이전 버전을 확인하십시오.git checkout‘명령과‘-‘옵션.

이것은 원격 저장소로 변경 사항을 푸시 할 때까지 로컬 저장소에서만 변경된다는 점에 유의해야합니다. 일부 변경 사항은 위의 경우와 같이 새 커밋 객체 ID를 생성하기 때문에 이러한 경우 기록이 분기되어 원격 저장소에 대한 정상적인 푸시가 거부됩니다. ‘ git push ‘명령과‘--힘‘옵션.

'마스터'브랜치 업데이트

'dev'브랜치의 버그를 수정했지만 이제이 변경 사항을 'master'브랜치와 병합 할 수 있습니다.

  • ‘마스터’로 전환, 명령 :git checkout master
  • '원본 / 마스터'에서 '마스터'로 최신 업데이트를 가져 오려면 다음 명령을 사용하십시오.git pull origin
  • 'dev'변경 사항 병합, 명령 :git merge giant

그러나 원격 저장소에서 더 많은 커밋이있는 경우 병합으로 인해 충돌이 발생할 수 있습니다. 충돌을 해결하고 병합을 계속하십시오.
마지막으로 안정적인 '마스터'브랜치 커밋 만 원격 저장소에 푸시하고이 예에서 'dev'와 같은 기능 브랜치에서만 더티 작업 (버그, 기능, 향상)을 수행합니다.
또한 논리적 분기 전략 git 워크 플로우 프로세스를 간소화하고 보호합니다.

요약하면‘git bisect’는 편리하고 유용한 명령으로 식별 그만큼 커밋 ID도입 ...에 결점 광범위한 도움으로 실행 코드에서 이진 검색 논리적으로 나누기 커밋 로그는 좋은나쁜 범하다 범위 . 결론적으로, 당신은 감지하다 잘못된 커밋과 돌아가는 것 그것으로 인한 변화.

또한 'good'및 'bad'하위 명령에 새 및 이전과 같은 용어를 사용하여 개정 상태를 설명 할 수도 있습니다. 다른 커밋 (she-1) ID를 식별하기 위해 다른 하위 명령과 개정 / 커밋 ID를 전달하여 명령을 여러 번 실행할 수 있습니다. 또는이 명령을 사용하여 손상된 코드를 빌드하기 위해 자동화 된 테스트 스크립트를 실행할 수도 있습니다. 또한 다음을 실행하여이 명령에 대한 자세한 설명을 찾으십시오.git bisect --help터미널에서. 그래서, 이것으로 우리는 Git Bisect에 대한이 기사를 끝냅니다.

DevOps의 의도는 팀 간의 커뮤니케이션과 협업을 강화하는 동시에 더 나은 품질의 소프트웨어를 더 빠르고 안정적으로 만드는 것입니다. 이 기사에 흥미가 있다면 c 도대체 전 세계에 250,000 명 이상의 만족 한 학습자 네트워크를 보유한 신뢰할 수있는 온라인 학습 회사 인 Edureka에서 Edureka DevOps 인증 교육 과정은 학습자가 DevOps가 무엇인지 이해하고 Puppet, Jenkins, Nagios, Ansible, Chef, Saltstack 및 GIT와 같은 다양한 DevOps 프로세스 및 도구에 대한 전문 지식을 습득하여 SDLC의 여러 단계를 자동화하는 데 도움이됩니다.

질문이 있으십니까? 'Git Bisect'기사의 댓글 섹션에 언급 해 주시면 최대한 빨리 연락 드리겠습니다.