programing

git 이등분 사용법?

i4 2023. 4. 11. 21:40
반응형

git 이등분 사용법?

는 몇 가지 이 있다.git bisect하지만, 나는 그것이 왜 멋진지 이해할 수 없다.

코드 샘플로 시연해 주실 수 있나요?

  1. 사용방법?
  2. 냥런 ??? is ?svn blame

에 ★★★★★★★★★★★★★★★★★★★★★★★★★★★.git bisect이력에서 바이너리 검색을 실행하여 특정 회귀를 찾는 것입니다.다음과 같은 개발 이력이 있다고 가정합니다.

... --- 0 --- 1 --- 2 --- 3 --- 4* --- 5 --- current

하지 않는 .current)」에서 동작하고 것을 합니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★0 중 이 있습니다.1,2,3,4,5,current.

각 커밋을 확인하고, 구축하고, 회귀가 존재하는지 여부를 확인할 수 있습니다.커밋 수가 많을 경우 시간이 오래 걸릴 수 있습니다.이것은 선형 검색입니다.바이너리 검색을 통해 더 나은 결과를 얻을 수 있습니다. '우리'가 말하는 예요.git bisect명령어를 사용합니다.각 단계에서 불량 가능성이 있는 리비전 수를 절반으로 줄이려고 합니다.

다음과 같은 명령을 사용합니다.

$ git stash save
$ git bisect start
$ git bisect bad
$ git bisect good 0
Bisecting: 2 revisions left to test after this (roughly 2 steps)
[< ... sha ... >] 3

명령어 에 " " " 가 표시됩니다.git커밋을 체크합니다.커밋이 .3프로그램을 빌드하여 회귀가 존재하는지 확인해야 합니다.'아까부터'라고 말해야 요.git git bisect bad, '회귀'가 존재하는 경우git bisect good그렇지 않다면.

를 들어,해 보겠습니다.4 이, 을 ''이라고 합니다git.

$ make
$ make test
... ... ...
$ git bisect good
Bisecting: 0 revisions left to test after this (roughly 1 step)
[< ... sha ... >] 5

그런 다음 다른 커밋을 체크아웃합니다. 중 하나4 ★★★★★★★★★★★★★★★★★」5(2월 2일)뽑았다고 해 볼까요?5빌드 후 프로그램을 테스트하여 회귀가 있는지 확인합니다. '아,아,아,아,아,아,아,아,아,아,아,아'에게 말합니다.git:

$ make
$ make test
... ... ...
$ git bisect bad
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[< ... sha ... >] 4

리비전인 '마지막 리비전'을 .4에 '회귀를 '회귀향은 '회귀'라고 합니다.git:

$ make
$ make test
... ... ...
$ git bisect bad
< ... sha ... > is the first bad commit
< ... commit message ... >

에서 우리는.3,4,5 (4가 아닌)1,2,3,4이것은 작은 승리이지만, 이것은 우리의 역사가 매우 작기 때문이다.커밋일 1 + N을 "N" "N" "1 + log2 N" "으로 .git bisect'N/2' 입니다.

회귀를 도입한 커밋을 찾으면 문제를 찾기 위해 해당 커밋을 검토할 수 있습니다.되면 " " " 를 사용합니다.git bisect reset 로 되돌리다git bisect명령어를 입력합니다.

git bisect run

★★★★★★★★★★★★가 있는 경우./test exit status가 0인 수 .bisect run:

git checkout KNOWN_BAD_COMMIT
git bisect start

# Confirm that our test script is correct, and fails on the bad commit.
./test
# Should output != 0.
echo $?
# Tell Git that the current commit is bad.
git bisect bad

# Same for a known good commit in the past.
git checkout KNOWN_GOOD_COMMIT
./test
# Should output 0.
echo $?
# After this, git automatically checks out to the commit
# in the middle of KNOWN_BAD_COMMIT and KNOWN_GOOD_COMMIT.
git bisect good

# Bisect automatically all the way to the first bad or last good rev.
git bisect run ./test

# End the bisect operation and checkout to master again.
git bisect reset

「」가 「」라고 하는 로 하고 있습니다../testtracked 입니다중 .이분할중에는이전커밋으로소실되지않습니다.

나무에서 인트리 스크립트를 복사하는 것만으로 빠져나갈 수 있다는 것을 알게 되었습니다.또한 이 스크립트를 사용하여PATH이치

테스트 가 「」의 이 되는 .test오래된 커밋에 따라 브레이크가 달라지기 때문에 해결 방법이 없습니다.커밋 테스트 방법을 하나씩 결정하면서 수동으로 작업을 수행해야 합니다.

그러나 이 자동화를 사용하는 것은 많은 경우 효과가 있습니다.또한 이 자동화를 밤새 실행할 수 있고 다음 날 아침까지 버그를 식별할 수 있기 때문에 작업이 지연되어 있는 느린 테스트에 큰 시간을 절약할 수 있습니다.

기타 힌트

후 첫 에 머무르지 '이등분하다'로.master:

git bisect reset HEAD

start + 니셜 +bad ★★★★★★★★★★★★★★★★★」good에 : 에: :

git bisect start KNOWN_BAD_COMMIT KNOWN_GOOD_COMMIT~

다음과 같습니다.

git checkout KNOWN_BAD_COMMIT
git bisect start
git bisect bad
git bisect good KNOWN_GOOD_COMMIT

테스트 로 참조).good ★★★★★★★★★★★★★★★★★」bad ★★★★★★★★★★★★★★★★★」run

git bisect log

샘플 출력:

git bisect log
git bisect start
# bad: [00b9fcdbe7e7d2579f212b51342f4d605e53253d] 9
git bisect bad 00b9fcdbe7e7d2579f212b51342f4d605e53253d
# good: [db7ec3d602db2d994fe981c0da55b7b85ca62566] 0
git bisect good db7ec3d602db2d994fe981c0da55b7b85ca62566
# good: [2461cd8ce8d3d1367ddb036c8f715c7b896397a5] 4
git bisect good 2461cd8ce8d3d1367ddb036c8f715c7b896397a5
# good: [8fbab5a3b44fd469a2da3830dac5c4c1358a87a0] 6
git bisect good 8fbab5a3b44fd469a2da3830dac5c4c1358a87a0
# bad: [dd2c05e71c246f9bcbd2fbe81deabf826c54be23] 8
git bisect bad dd2c05e71c246f9bcbd2fbe81deabf826c54be23
# bad: [c536b1b7242d5fcf92cd87e9a534bedb1c0c9c05] 7
git bisect bad c536b1b7242d5fcf92cd87e9a534bedb1c0c9c05
# first bad commit: [c536b1b7242d5fcf92cd87e9a534bedb1c0c9c0

git log에 좋은 참조와 나쁜 참조를 표시하여 시간을 더 잘 파악합니다.

git log --decorate --pretty=fuller --simplify-by-decoration master

이는 대응하는 ref를 가진 커밋만 표시되므로 노이즈가 대폭 감소하지만 다음과 같은 유형의 ref가 자동으로 생성됩니다.

refs/bisect/good*
refs/bisect/bad*

어떤 커밋이 좋은지 나쁜지 알 수 있습니다.

명령어를 조작하는 경우는, 이 테스트 리포트를 고려해 주세요.

실패는 빠르고 성공은 느리다

경우에 따라서는:

  • 실패는 빠르게 일어난다. 예를 들어 첫 번째 테스트 중 하나가 고장난다.
  • 성공에는 시간이 걸립니다.예를 들어, 고장난 테스트는 합격하고, 다른 모든 테스트는 우리가 신경 쓰지 않습니다.

5초 한 대로 에는 5초 이내에 테스트를 합니다.timeout

#!/usr/bin/env bash
timeout 5 test-command
if [ $? -eq 1 ]; then
  exit 1
fi

이 기능은 다음부터 유효합니다.timeout를 종료합니다.124「 」의 test-command를 종료합니다.1.

매직 종료 상태

git bisect run출구 에 대해 까다롭습니다: 상태에 대해 조금 까다롭습니다.

  • 127보다 큰 것은 다음과 같은 이등분할을 실패하게 합니다.

    git bisect run failed:
    exit code 134 from '../test -aa' is < 0 or >= 128
    

    C' 'C'는assert(0)이 튀다SIGABRT귀찮습니다.134는 매우 귀찮습니다.

  • 로 건너뛰게 .git bisect skip.

    이 기능의 목적은 관련 없는 이유로 인해 손상된 빌드를 건너뛸 수 있도록 하는 것입니다.

것은, 을 참조하십시오.man git-bisect세한것 、 을을해해요요 。

따라서 다음과 같은 방법을 사용할 수 있습니다.

#!/usr/bin/env bash
set -eu
./build
status=0
./actual-test-command || status=$?
if [ "$status" -eq 125 ] || [ "$status" -gt 127 ]; then
  status=1
fi
exit "$status"

git 2.16.1에서 테스트 완료.

TL;DR

시작:

$ git bisect start
$ git bisect bad
$ git bisect good <goodcommit>

또는

$ git bisect start
$ git bisect good
$ git bisect bad <badcommit>

Bisecting: X revisions left to test after this (roughly Y steps)

반복:

아직 문제가 있나요?

  • ::$ git bisect bad
  • ★★★★★★★★★★★★★★:$ git bisect good

결과:

<abcdef> is the first bad commit

완료 시:

git bisect reset

한 가지 더 덧붙이자면

할 수 .git bisect start특정 파일에서 버그가 발생했다는 것을 알 수 있습니다.들어 에 있는 을 알고 하면 com/workingDir 를 할 수 .git bisect start com/workingDir즉, 이 디렉토리의 내용을 변경한 커밋만 체크되므로 작업이 더욱 빨라집니다.

나쁜지 는, 「좋아요」를 실행해 주세요.git bisect skip 커밋을 .다른 커밋이 충분히 있는 경우 git bisect는 다른 커밋을 사용하여 검색을 좁힙니다.

$ git bisect ..기본적으로 디버깅을 위한 Git 도구입니다.'Git Bisect'는 마지막(알려진) 작업 커밋 이후의 이전 커밋을 통해 디버깅합니다.이진 검색을 사용하여 이러한 모든 커밋을 살펴보고 회귀/버그를 도입한 커밋을 찾습니다.

$ git bisect start # ★★★★★★★★★★★★★★★★★★★」

$ git bisect bad 커밋에 회귀/.5) 포인트가

$ git bisect good v1.0 작업 커밋 없음 # (회귀 없음)

이 '나쁜' 포인트와 '좋은' 포인트를 언급하면 이등분(바이너리 검색)이 중간 요소(commit v1.3)를 선택하는 데 도움이 됩니다.회귀가 커밋 v1.3으로 설정되어 있는 경우는, 새로운 「불량」포인트로서 설정합니다(Good -> v1.0 및 Bad -> v1.3).

$ git bisect bad

또는 마찬가지로 커밋 v1.3이 버그가 없는 경우 이를 새로운 '양호점'으로 설정합니다(*Good -> v1.3 및 Bad -> v1.6).

$ git bisect good

★★★★★★★★★★★★★★★★★★★★*good ★★★★★★★★★★★★★★★★★」bad특정 속성 유무에 관계없이 커밋 마킹에 사용할 수 있는 것은 이뿐만이 아닙니다.

(2015년 Git 2.7 (2015년 4분기)git bisect★★★★★★★★★★★★★★★★★★.

 git bisect start [--term-{old,good}=<term> --term-{new,bad}=<term>]
                  [--no-checkout] [<bad> [<good>...]] [--] [<paths>...]

문서 추가 시:

경우에 따라서는 파손을 초래한 커밋을 찾는 것이 아니라 다른 '구' 상태와 '신규' 상태 사이에서 변경을 일으킨 커밋을 찾는 경우가 있습니다.

예를 들어 특정 수정을 도입한 커밋을 찾고 있을 수 있습니다.
또는 소스 코드 파일 이름이 회사의 명명 표준으로 모두 변환된 첫 번째 커밋을 찾을 수도 있습니다.아니면 뭐든.

이러한 경우 "변경 전 상태"와 "변경 후 상태"를 지칭하기 위해 "양호"와 "불량"이라는 용어를 사용하는 것은 매우 혼란스러울 수 있습니다.

대신 '어울리지 않다'라는 쓸 수 요.old및 " " " "new'''는 '''대신 '''good및 " " " "bad
, ('나'는 섞을 수 .)good및 " " " "bad " "와 함께 "old및 " " " "new.) 1개의 세션에 있습니다.

용법에서는 ''를 붙입니다.git bisect「」와 함께new에는 몇 "commit" "commit" "commit" "commit" "commit" 가 있습니다.old그 속성을 가지지 않는 커밋.

★★git bisect커밋을 체크 아웃 하고, 그 커밋에 속성이 있는지 테스트합니다.
커밋"으로 합니다.new 않으면 " , " 로 합니다.old

git bisect는 속성을 도입한 커밋을 보고합니다.


Matthieu Moy()moy의 commit 06e6a74, commit 21b55e3, commit fe67687(2015년 6월 29일)을 참조하십시오.
Antoine Delaite()CanardChouChinois의 commit 21e5cfd(2015년 6월 29일)를 참조하십시오.
(2015년 10월 5일, Junio C Hamano에 의해 합병)


2.39 (Q4 2022)는 Git39 ( 2022)를.git bisect run: 에되어 있습니다.bisect-helper이 명령어는 " git bisect run(man)에 대한 인수를 도우미에 대한 인수로 잘못 취급합니다.

commit e9011b6,sgn commit 464ce0a, commit 58786d7 (2022년 11월 10일)」을 참조해 주세요.
(커밋 e3d40fb, 2022년 11월 23일 Junio C Hamano에 의해 병합됨)

bisect--helper: parse 서브 명령어OPT_SUBCOMMAND

보고서 작성자: 루카시 독터
서명자: 도안 쩐콩단
서명자:테일러 블라우

상태에서는, 「」를 사용해 를 해석하고 .OPT_CMDMODE,명령어가 검출된 경우에도 추가 옵션을 계속 해석합니다.

명령어를 사용하여 ""git bisect run(man) 를 실행하고 있을 때--log ★★★★★★★★★★★★★★★★★」--no-log 중 를 지정합니다.--bisect-... 인수,bisect--helper를 잘못 있을 것 같다bisect--helper의 옵션입니다.

「」를 건네는 할 수 있을지도 모릅니다.--" " 에서 때git-bisect.sh--로, 「」로,bisect--helper.
'보다', '보다'는 방해가 될 수 .--

이 를 해석해 요?OPT_SUBCOMMANDAPI가 이 특정 사용 사례에 대해 탄생했기 때문입니다.

git 이등분 종료 상태

Ciro Santilli2014년 답변은 이들을 "매직 출구 상태"라고 부릅니다.

Git 2.36 (Q2 2022)에서는 약간 다르게 사용됩니다.흔하지 않은 실수는 실행 가능한 상태로 ""를 git bisect(man)실행하는 스크립트를 작성하는 것입니다.이 경우 모든 테스트는 126 또는 127의 에러 코드로 종료되며, 심지어 정상으로 표시된 리비전에서도 종료됩니다.

이 상황을 인지하고 조기에 반복을 중지하도록 하십시오.

르네 샤프의 commit rscharfe48af1fd, commit ba5b81, commit 8efa2ac, commit 80c2e96(2022년 1월 18일)을 참조하십시오.
(커밋 e828747, 2022년 3월 6일에 Junio C Hamano에 의해 병합됨)

bisect--helper: 종료 코드 126 및 127의 실행 명령어 재확인

서명자: 르네 샤프

실행 명령을 실행하거나 찾을 수 없는 경우 셸은 각각 종료 코드 126 또는 127을 반환합니다.
그러나 유효한 run 명령어는 이력상의 이유로 잘못된 리비전을 나타내기 위해 이러한 코드를 반환할 수도 있습니다.

즉, 오타가 발생하면 전체 거리를 초과하여 잘못된 결과를 보고하는 가짜 이등분 실행이 발생할 수 있습니다.

최선의 해결책은 종료 코드 126과 127을 71b0251(Bisect run: , 2007-10-26, Git v1.5.4-rc0 -- merge)과 같이 예약하는 것입니다(Bisect run: 스크립트 종료 코드가 125인 경우 "skip" current commit을 "sip" if script exit code 125., 2007-10-26).bisect run찾을 수 있을 거야
그러나 126과 127이 잘못된 수정에 사용될 수 있다는 문서에 의존했던 사람들에게는 불편할 수 있다.

이 패치가 사용하는 회피책은 정상적인 리비전에서 명령을 실행하여 동일한 에러 코드가 표시되는 경우 중단하는 것입니다.
이것에 의해, 종료 코드 126 및 127을 사용하는 스크립트로의 실행이 1개의 스텝이 추가되지만, 1개의 예외는 있습니다.(수동으로 표시된) 정상적인 리비전을 인식할 수 없는 명령어에서는 작동하지 않습니다.

낮은 종료 코드를 사용하는 실행 명령어는 영향을 받지 않습니다.
누락된 명령어를 두 번 실행하고 체크아웃을 세 번 실행한 후 오타가 보고됩니다(첫 번째 순서, 알려진 정상 리비전 후 첫 번째 스텝 리비전으로 돌아갑니다).

를 참조해 주세요.

언급URL : https://stackoverflow.com/questions/4713088/how-to-use-git-bisect

반응형