첫 번째 GOOD 커밋을 찾기 위해 git bisect를 어떻게 사용할 수 있습니까?


94

다음과 같은 문제가 있습니다.

  • 버전 master이 잘 작동합니다.
  • 이전의 마지막 태그 버전 master(예 last: 버그가 있음)
  • 동료는 last특정 버그에 대한 수정 패치가 필요합니다.

괜찮아. 우리 친구에게 git bisect버그를 수정 한 개정판을 요청합시다 .

git bisect start
git bisect bad last
git bisect good master

그러나 그것은 작동하지 않을 것입니다.

일부 좋은 rev는 나쁜 rev의 조상이 아닙니다.
이 경우 git bisect가 제대로 작동하지 않습니다.
좋은 회전 수와 나쁜 회전 수를 착각 할 수 있습니까?

이것을 극복하기위한 힌트가 있습니까? 문서에서 뭔가를 놓쳤나요?


1
git bisect run ...이등분을 자동화하기 위해 실행 중 입니다. 나는 기회가 없다, 그래서 그냥 단어를 교환하는 goodbad(너무 분명했다). run첫 번째 좋은 개정판을 찾는 방법은 무엇입니까?
Daniel Böhmer

@ DanielBöhmer : 실행중인 스크립트 내에서 용어를 바꿔야 합니다.
eckes

에서 실행하는 스크립트 는 문자열이 아닌 종료 코드로 양호 또는 불량git bisect run반환 합니다. 아래에 방금 게시 한 내 답변을 참조하십시오.
Daniel Böhmer

@ DanielBöhmer : 글쎄,이 경우 반환 코드를 반전해야합니다.
eckes

맞습니다. 제 답변에 설명되어 있습니다.
다니엘 Böhmer

답변:


100

git 2.7부터 --term-old 및 --term-new 인수를 사용할 수 있습니다.

예를 들어 다음과 같이 문제 해결 커밋을 식별 할 수 있습니다.

git bisect start --term-new=fixed --term-old=unfixed
git bisect fixed master
git bisect unfixed $some-old-sha1

테스트 할 때 git bisect fixed또는 git bisect unfixed적절하게 말하십시오 .

2.7 이전의 git 버전에 대한 이전 답변

나쁜 것은 좋은 것을 의미하고 좋은 것은 나쁜 것을 의미한다고 생각하도록 일시적으로 훈련하는 대신 별칭을 만들어 보는 것은 어떨까요?

다음을 ~/.gitconfig추가하십시오.

[alias]
        bisect-fixed = bisect bad
        bisect-unfixed = bisect good

따라서 문제 해결 커밋 식별을 시작할 수 있습니다.

$ git bisect start
$ git bisect-fixed master
$ git bisect-unfixed $some-old-sha1

테스트 할 때 git bisect-fixed또는 git bisect-unfixed적절하게 말하십시오 .


5
제쳐두고, git은 하위 명령의 별칭을 만들 수 없습니다. 따라서 대시. 실제로 가능하거나 가능하다면 누군가가 답변을 업데이트하기를 바랍니다.
Michael Wolf

3
별칭을 사용하더라도 git의 출력은 그렇지 않으므로 여전히 foo를보고 is the first bad commit하므로 임시 교육이 여전히 필요한 것 같습니다.
ThomasW 2015 년

2
공정한 포인트. (귀하의 의견에 업보를 남겼습니다.) 비록 처리해야 할 추가인지 부하가 ​​최소한 조금 적어 지지만 프로그래머로서 우리는 이미 많은 것을 가지고 있습니다.
Michael Wolf

1
'before'와 'after'별칭을 사용하는 것이 좋습니다. 이렇게하면 "버그를 볼 때 '좋은'이라고 써야합니다."라는 반전을 수행하는인지 적 오버 헤드가 없습니다. 대신 당신은 버그의 출현 / 사라짐을 찾고 있다는 것을 기억하는 (즉, 당신이 찾고있는 어떤 종류의 변화를 기억하기 위해- "무엇을하기 전에?") 기억하는 오버 헤드 만있을 것입니다.
Jonas Kölker

1
@ JonasKölker, 좋은 생각입니다. 귀하의 권장 사항 에 따라 답변에 제안 된 별칭과 bisect-after = bisect bad및을 사용했습니다 bisect-before = bisect good. 이제 별칭 집합을 사용할 수 있습니다. 우리는 몇 번의 사용 후에 내가 더 선호하는 것을 보게 될 것입니다.
Gabriel Staples 2018

47

나는 단지 "속임수"git과 좋은 <=> 나쁜 의미를 바꾼다.

즉, "나쁨"을 문제를 나타내지 않는 것으로 간주하여 패치를 기반으로하는 "좋은"버전이 아닙니다.

어쨌든 좋은 것과 나쁜 것은 꽤 주관적인 개념입니다. :)

git bisect start
git bisect good last
git bisect bad master

2
글쎄요, 당신이 그것에 대해 생각해 보면 선과 악이 무엇인지에 대한 일반적인 의미는 없습니다. (아마 종교 에서조차도 아닙니다.) 그것은 단지 여러분의 목적에 달려 있습니다. 이 방법은 실제로 속이는 것이 아닙니다.하지만 아마도 Git 's Sin (종교적 주제에 머물러있는 것 : D는보다 중립적 인 "목표"/ "원래"보다는 그러한 논쟁적인 용어를 선택하는 것입니다. boggling ;-)
inger 2013 년

버그가 "좋은"것이 될 수 있다는 말을 처음 들었을 것입니다.
MarcH

1
이 질문을 찾기 전에 제가 한 일입니다. 더 이상하지 않을 것입니다. 전체 이분법이 잘못되기 전에 오답 하나만 필요하다는 것을 기억하십시오. 마음을 비틀 지 마십시오.
proski

21

git bisect run내가 Perl의 prove명령 (자동 테스트를 실행 함)으로했던 것처럼 사용하고 있다면 good, 그리고 bad. 테스트의 성공은 종료 코드로보고됩니다.

다음에서 실행하는 프로그램의 종료 코드를 무효화하는 유효한 Bash 구문을 찾았습니다 git bisect run.

git bisect start
git bisect bad HEAD                 # last revision known to PASS the tests
git bisect good $LAST_FAIL_REVISION # last revision known to FAIL the tests
git bisect run bash -c "! prove"

이것은 나에게 의해 실행되는 테스트 를 통과 하는 첫 번째 개정판을 제공 했습니다 prove.


1
동의합니다. 테스트 케이스를 수정하지 않기 때문에 이것이 완벽합니다.
seanlinsley

8

힘내 이제 사용할 수있게 old하고 new그들을 먼저 정의하지 않고. git bisect start추가 인수로 커밋없이 호출 한 다음 다음을 호출하여 이분법을 올바르게 시작해야합니다.

git bisect old <rev>
git bisect new <rev>

https://git-scm.com/docs/git-bisect#_alternate_terms

이것은 본질적으로 @MarcH가 구현해야한다고 제안한 것입니다.


1
이것은 가장 관련성이 높은 답변입니다 (현대 git의 경우). 그리고 시작 명령이 있어야한다 (당신을 연결하는 공유에 따라) :git bisect start --term-new fixed --term-old broken
샘 첸코

진실. 이러한 옵션은 언제 도입 되었습니까? 내 답변을 업데이트하고 싶습니다.
Michael Wolf

@MichaelWolf 2.7.0 버전에 등장했습니다 .
GKFX

6

망할 놈의 별명은, 그러나 조건 좋은 아이디어입니다 fixedunfixed보다 동일한 문제가 goodbad: 당신이 그 (것)이 호환 될 수 없습니다 모두 회귀 분석 및 진행. 어떤 방식 으로든 작동하는 단어를 찾는 것은 쉽습니다. 좋은 것이나 나쁜지에 대한 선입견없이 본질적으로 중립적 인 원래 이진 검색 용어에서 단어를 선택하기 만하면됩니다. 예를 들면 :

git config --global alias.bisect-high 'bisect bad'
git config --global alias.bisect-low  'bisect good'

이와 같은 중립 용어 를 사용하면 회귀 또는 수정을 찾고 있든 상관없이 항상 git bisect-high(또는 git bisect-upper, 또는 git-bisect max, ... 선택!)을 입력 할 수 있습니다 .

안타깝게도 git bisect 개발자는 기존 용어를 ​​단순히 재사용 할 수 없습니다. 사용자 인터페이스는 일반적으로 git의 관심사가 아닙니다. http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/


From : git.github.io/rev_news/2015/07/08/edition-5 "일부 패치 시리즈는 git bisect가 좋고 나쁨 대신 임의의 용어 쌍을 사용할 수 있도록 다듬어지고 있습니다."
MarcH
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.