2013-03-14 16 views
62

Mam następujący problem:Jak mogę użyć git bisect, aby znaleźć pierwszy DOBRY commit?

  • wersja na master działa dobrze
  • wersję ostatniego znacznika przed master (słownie last) ma błąd
  • kolega potrzebuje patcha dla swojego last rewizji dla tego konkretnego błędu:

OK. Zapytajmy naszego przyjaciela git bisect dla rewizji że Poprawiono błąd:

git bisect start 
git bisect bad last 
git bisect good master 

Ale to nie zadziała:

Kilka dobrych obrotów nie jest przodkiem złej rev.
git bisect nie może działać poprawnie w tym przypadku.
Może popełniasz błędy dobre i złe?

Jakieś wskazówki do przezwyciężenia tego? Czy tęskniłem za czymś w dokumentach?

+1

Używam 'git bisect run ...' do automatyzacji bisecting. Nie mam więc szansy na zamianę słów "dobry" i "zły" (to było zbyt oczywiste). Jak używać 'run' do znalezienia pierwszej dobrej wersji? –

+0

@ DanielBöhmer: musisz zmienić warunki ** w swoim skrypcie ** prowadzony, prawda? – eckes

+0

Skrypt uruchamiany przez 'git bisect run' zwraca * dobry * lub * zły * jako kod zakończenia, a nie ciąg znaków. Zobacz moją odpowiedź Właśnie napisałem poniżej. –

Odpowiedz

56

Od wersji 2.7 można użyć argumentów --term-old i --term-new.

Na przykład, można zidentyfikować problem z manipulowaniem popełnić tak:

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

Jak można sprawdzić, czy powiedzieć git bisect fixedgit bisect unfixed jako odpowiedni.

Old odpowiedź, dla wersji git przed 2,7

Zamiast tymczasowo szkoli się myśleć, że złe oznacza dobry i dobry oznacza złe, to dlaczego nie stworzyć kilka aliasów?

W ~/.gitconfig dodać następujące:

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

można rozpocząć identyfikację problem ustalania popełnić tak:

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

Jak można sprawdzić, czy powiedzieć git bisect-fixedgit bisect-unfixed jako właściwe.

+3

Na marginesie, git nie pozwala ci tworzyć aliasów poleceń podrzędnych. Stąd kreski.Jeśli rzeczywiście jest (lub jest) możliwe, mam nadzieję, że ktoś zaktualizuje odpowiedź. –

+0

I w linii poleceń: 'git config --global alias.bisect-broken 'bisect good'' i' git config --global alias.bisect-fixed' bisect bad'' –

+1

Nawet jeśli używasz aliasów, wyjście z git nie będzie, więc nadal będzie zgłaszać foo "to pierwsze złe zatwierdzenie", więc wydaje się, że tymczasowe szkolenie jest nadal konieczne, nie? – ThomasW

43

Po prostu "oszukiwałbym" git i zamieniłbym się w dobre dobre < => złe.

Innymi słowy, uważaj "złe" za coś, co nie przedstawia problemu, więc nie jest to "dobra" wersja, na której można oprzeć łatę.

W każdym razie dobre i złe są dość subiektywnymi koncepcjami, prawda? :)

git bisect start 
git bisect good last 
git bisect bad master 
+5

działa, ale przekręca umysł :-) – eckes

+2

Cóż, jeśli myślisz o tym, nie ma ogólnego znaczenia, co jest dobre lub złe (prawdopodobnie nawet w religii). To zależy od twoich celów. W ten sposób to naprawdę nie jest oszustwo - ale może Git's Sin (pozostać na religijnym temacie: D ma podnieść taki kontrowersyjny termin, a nie bardziej neutralny "cel"/"pochodzenie". Ale tak, filozofią może być myśl Ogromne ;-) – inger

+3

Uwielbiam tę odpowiedź. – patrickvacek

5

Git aliasy są dobrym pomysłem, jednak terminy fixed i unfixed mają ten sam problem niż good i bad: nie można mieć im być zgodne z obu regresji i progresji. Łatwo jest znaleźć słowa, które działają w dowolny sposób: po prostu odszukaj je z oryginalnej terminologii wyszukiwania binarnego, która ma charakter neutralny, bez uprzedniej świadomości tego, co jest dobre lub złe. Na przykład:

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

w neutralnych warunkach jak te zawsze można wpisać: git bisect-high (! Lub git bisect-upper lub git-bisect max ... do wyboru) czy szukasz regresji lub poprawki.

Szkoda, że ​​deweloperzy git bisect nie mogli po prostu ponownie użyć żadnego z istniejących warunków. Interfejs użytkownika nie jest git obawa, ogólnie mówiąc: http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/

+0

Od: http://git.github.io/rev_news/2015/07/08/edition-5/ "Niektóre serie łat są polerowane, aby umożliwić git bisect użycie dowolnej pary terminów zamiast dobrych i złych. .. " – MarcH

14

Jeśli używasz git bisect run jak robiłem z prove komendy Perl (czyli automatyczne testy) nie masz szans prostu zamienią good i bad. Powodzenie testów zostanie zgłoszone jako kod wyjścia.

znalazłem prawidłową składnię Basha negować kod wyjścia programu prowadzonego przez 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" 

Ten dał mi pierwszą wersję do przejściu na testy wykonywane przez prove.

+2

To powinna być zaakceptowana odpowiedź! –

+0

Zgadzam się, wolałbym nie modyfikować mojego przypadku testowego, więc jest to idealne. – seanlinsley

5

Git pozwala teraz używać old i new bez ich wcześniejszego zdefiniowania. Trzeba zadzwonić git bisect start bez popełnia jako kolejne argumenty, a następnie prawidłowo rozpocząć Bisekcja wywołując

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

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

To w istocie jest to, co @MarcH sugerował powinny być realizowane.