Jak mogę użyć git bisect, aby znaleźć pierwsze DOBRE zatwierdzenie?


95

Mam następujący problem:

  • wersja masterdziała dobrze
  • wersja ostatniego tagu przed master(powiedzmy last) ma błąd
  • kolega potrzebuje poprawki do swojej lastpoprawki na ten błąd

W porządku. Zapytajmy naszego przyjaciela git bisecto wersję, która naprawiła błąd:

git bisect start
git bisect bad last
git bisect good master

Ale to nie zadziała:

Niektóre dobre obroty nie są przodkami złych obrotów.
git bisect nie może działać poprawnie w tym przypadku.
Może mylisz dobre i złe obroty?

Jakieś wskazówki, jak temu zaradzić? Czy przegapiłem coś w dokumentach?


1
Używam git bisect run ...zautomatyzować bisecting. Nie mam więc szansy po prostu zamienić słów goodi bad(to było zbyt oczywiste). Jak używać, runaby znaleźć pierwszą dobrą wersję?
Daniel Böhmer

@ DanielBöhmer: musisz zamienić warunki w uruchamianym skrypcie , prawda?
eckes

Skrypt uruchamiany przez git bisect runzwraca dobry lub zły jako kod zakończenia, a nie jako ciąg. Zobacz moją odpowiedź, którą właśnie zamieściłem poniżej.
Daniel Böhmer

@ DanielBöhmer: cóż, w takim przypadku będziesz musiał odwrócić kod powrotu, prawda?
eckes

Zgadza się, to właśnie jest opisane w mojej odpowiedzi.
Daniel Böhmer

Odpowiedzi:


100

Począwszy od git 2.7, możesz używać argumentów --term-old i --term-new.

Na przykład, możesz zidentyfikować zatwierdzenie naprawiające problem w ten sposób:

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

Podczas testu powiedz git bisect fixedlub git bisect unfixedodpowiednio.

Stara odpowiedź dla wersji gita starszych niż 2.7

Zamiast tymczasowo uczyć się myśleć, że zło oznacza dobro, a dobro oznacza zło, dlaczego nie stworzyć aliasów?

Dodatkowo ~/.gitconfig:

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

Możesz zacząć identyfikować zatwierdzenie naprawiające problemy w ten sposób:

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

Podczas testu powiedz git bisect-fixedlub git bisect-unfixedodpowiednio.


5
Na marginesie, git nie pozwala na tworzenie aliasów poleceń podrzędnych. Stąd myślniki. Jeśli rzeczywiście jest (lub jest) możliwe, miejmy nadzieję, że ktoś zaktualizuje odpowiedź.
Michael Wolf

3
Nawet jeśli użyjesz aliasów, wyjście z git nie będzie, więc nadal będzie raportować foo is the first bad commit, więc wydaje się, że tymczasowe szkolenie jest nadal konieczne, nie?
ThomasW

2
Słuszna uwaga. (Głos zabrali twój komentarz.) Chociaż mimo to miejmy nadzieję, że jest to przynajmniej trochę mniejsze dodatkowe obciążenie poznawcze, z którym trzeba sobie poradzić, a jako programiści mamy już wiele.
Michael Wolf

1
Zalecam używanie aliasów „przed” i „po”. W ten sposób nie masz narzutów poznawczych związanych z wykonywaniem inwersji „kiedy zobaczę błąd, powinienem napisać„ dobrze ””; zamiast tego masz tylko - prawdopodobnie mniejszy - narzut związany z pamiętaniem, że szukasz pojawienia się / zniknięcia błędu (tj. pamiętasz, jakiego rodzaju zmiany szukasz - „przed czym?”).
Jonas Kölker

1
@ JonasKölker, to świetny pomysł. W odpowiedzi użyłem sugerowanych aliasów, a także bisect-after = bisect badi bisect-before = bisect good, zgodnie z twoją rekomendacją. Teraz mogę użyć dowolnego zestawu aliasów. Po kilku zastosowaniach zobaczymy, które z nich bardziej mi się podobają.
Gabriel Staples,

47

Po prostu „oszukiwałbym” gita i zamieniałbym znaczenie dobrego <=> złego.

Innymi słowy, traktuj „złą” jako coś, co nie powoduje problemu, więc nie jest to „dobra” wersja, na której można oprzeć twoją łatkę.

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

git bisect start
git bisect good last
git bisect bad master

2
Cóż, jeśli się nad tym zastanowić, nie ma ogólnego znaczenia, co jest dobre, a co złe (prawdopodobnie nawet w religii)… to zależy tylko od twoich celów. W ten sposób to naprawdę nie jest oszustwo - ale może Git's Sin (pozostając przy religijnym temacie: D to raczej wybór tak kontrowersyjnego terminu niż bardziej neutralnego „celu” / „pochodzenia”. boggling ;-)
inger

To chyba pierwszy raz, kiedy słyszę, że błędy mogą być „dobre”.
MarcH

1
To właśnie zrobiłem, zanim znalazłem to pytanie. Nie zamierzam już tego robić. Pamiętaj, że wystarczy jedna błędna odpowiedź, zanim cała połowa się nie powiedzie. Nie zawracaj sobie głowy.
proski

21

Jeśli używasz tak, git bisect runjak robiłem to z provepoleceniem Perla (który uruchamia testy automatyczne), nie masz możliwości po prostu zamienić goodi bad. Powodzenie testów zostanie zgłoszone jako kod zakończenia.

Znalazłem poprawną składnię Bash, aby zanegować kod zakończenia programu uruchamianego 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"

To dało mi pierwszą wersję, która przeszła testy prove.


1
Zgadzam się, wolałbym nie modyfikować mojego przypadku testowego, więc jest idealny.
seanlinsley

8

Git teraz pozwala używać oldi newbez uprzedniego ich definiowania. Musisz wywołać git bisect startbez zatwierdzeń jako dalsze argumenty, a następnie poprawnie rozpocząć bisekcja przez wywołanie

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

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

Zasadniczo to, co sugerował @MarcH, powinno zostać wdrożone.


1
To jest najbardziej odpowiednia odpowiedź (dla współczesnego gita). A komendą startową powinno być (zgodnie z udostępnionym linkiem):git bisect start --term-new fixed --term-old broken
Sam Protsenko

Prawdziwe. Kiedy wprowadzono te opcje? Chciałbym zaktualizować moją odpowiedź.
Michael Wolf,

@MichaelWolf Pojawiły się w wersji 2.7.0 .
GKFX

6

Aliasy Gita są dobrym pomysłem, jednak terminy fixedi unfixedmają ten sam problem co goodi bad: nie można ich mieć kompatybilnych zarówno z regresjami, jak i progresjami. Łatwo jest znaleźć słowa, które działają w obie strony: po prostu wybierz je z oryginalnej terminologii wyszukiwania binarnego, która ma charakter neutralny i nie ma z góry koncepcji, co jest dobre, a co złe. Na przykład:

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

Dzięki neutralnym terminom, takim jak te, zawsze możesz wpisać: git bisect-high(lub git bisect-upper, lub git-bisect max... Twój wybór!), Czy szukasz regresji, czy poprawki .

Szkoda, że ​​programiści git bisect nie mogli po prostu ponownie użyć żadnego z istniejących terminów. Ogólnie rzecz biorąc, interfejs użytkownika nie jest problemem git: http://stevebennett.me/2012/02/24/10-things-i-hate-about-git/


Od: git.github.io/rev_news/2015/07/08/edition-5 „Niektóre serie poprawek są dopracowywane, aby umożliwić git bisect używanie arbitralnej pary terminów zamiast dobrych i złych…”
MarcH
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.