Príkaz git bisect poskytuje spôsob, ako urýchliť proces detekcie chyby. Umožní vám to rýchlejšie určiť problém. Pomocou git bisect môžete definovať rozsah záväzkov, pri ktorých máte podozrenie, že majú problémový kód, a potom pomocou binárnych eliminačných metód vyhľadať začiatok problému. Hľadanie chýb je rýchlejšie a jednoduchšie.
Poďme si pripraviť príklad a spustiť niekoľko testovacích prípadov, aby sme zistili, ako to funguje.
Príklad nastavenia
V našom príklade vytvoríme test.súbor txt a pri každom potvrdení pridajte do súboru nový riadok. Po 16 potvrdeniach bude konečný stav súboru vyzerať takto:
Tu je môj dobrý kód 1Tu je môj dobrý kód 2
Tu je môj dobrý kód 3
Tu je môj dobrý kód 4
Tu je môj dobrý kód 5
Tu je môj dobrý kód 6
Tu je môj dobrý kód 7
Tu je môj dobrý kód 8
Tu je môj zlý kód 1 <-- BUG INTRODUCED HERE
Tu je môj zlý kód 2
Tu je môj zlý kód 3
Tu je môj zlý kód 4
Tu je môj zlý kód 5
Tu je môj zlý kód 6
Tu je môj zlý kód 7
Tu je môj zlý kód 8
Tu je môj zlý kód 9
Vo vyššie uvedenom príklade sa chyba dostala do kódu po 8 spáchaniach. Pokračovali sme vo vývoji kódu aj po zavedení chyby.
Môžete vytvoriť priečinok s názvom my_bisect_test a pomocou nasledujúcich príkazov vo vnútri priečinka vytvoriť príkladnú situáciu:
git initecho "Tu je môj dobrý kód 1"> test.TXT
git add -A && git commit -m "Moje potvrdenie 1"
echo "Tu je môj dobrý kód 2" >> test.TXT
git add -A && git commit -m "Moje potvrdenie 2 (v1.0.0) „
echo "Tu je môj dobrý kód 3" >> test.TXT
git add -A && git commit -m "Moje potvrdenie 3"
echo "Tu je môj dobrý kód 4" >> test.TXT
git add -A && git commit -m "Moje potvrdenie 4"
echo "Tu je môj dobrý kód 5" >> test.TXT
git add -A && git commit -m "Moje potvrdenie 5 (v1.0.1) „
echo "Tu je môj dobrý kód 6" >> test.TXT
git add -A && git commit -m "Moje potvrdenie 6"
echo "Tu je môj dobrý kód 7" >> test.TXT
git add -A && git commit -m "Môj záväzok 7 (v1.0.2) „
echo "Tu je môj dobrý kód 8" >> test.TXT
git add -A && git commit -m "Môj commit 8"
echo "Tu je môj zlý kód 1"> test.TXT
git add -A && git commit -m "Môj commit 9"
echo "Tu je môj zlý kód 2" >> test.TXT
git add -A && git commit -m "Môj commit 10"
echo "Tu je môj zlý kód 3" >> test.TXT
git add -A && git commit -m "Môj commit 11"
echo "Tu je môj zlý kód 4" >> test.TXT
git add -A && git commit -m "Môj commit 12 (v1.0.3) „
echo "Tu je môj zlý kód 5" >> test.TXT
git add -A && git commit -m "Moje potvrdenie 13"
echo "Tu je môj zlý kód 6" >> test.TXT
git add -A && git commit -m "Môj commit 14"
echo "Tu je môj zlý kód 7" >> test.TXT
git add -A && git commit -m "Môj commit 15 (v1.0.4) „
echo "Tu je môj zlý kód 8" >> test.TXT
git add -A && git commit -m "Môj commit 16"
Kontroluje sa história
Ak sa pozriete na históriu záväzkov, uvidíte nasledujúce:
$ git logspáchať 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Autor: Zak H
Dátum: Ne 31. decembra 23:07:27 2017 -0800
Môj záväzok 17
spáchať 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Autor: Zak H
Dátum: Ne 31. decembra 23:07:25 2017 -0800
Môj záväzok 16
spáchať 598d4c4acaeb14cda0552b6a92aa975c436d337a
Autor: Zak H
Dátum: ne 31. decembra 23:07:23 2017 -0800
Môj záväzok 15 (v1.0.4)
spáchať b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Autor: Zak H
Dátum: Ne 31. decembra 23:07:21 2017 -0800
Môj záväzok 14
spáchať eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Autor: Zak H
Dátum: ne 31. decembra 23:07:19 2017 -0800
Môj záväzok 13
spáchať 3cb475a4693b704793946a878007b40a1ff67cd1
Autor: Zak H
Dátum: ne 31. decembra 23:07:17 2017 -0800
Moje spáchanie 12 (v1.0.3)
spáchať 0419a38d898e28c4db69064478ecab7736700310
Autor: Zak H
Dátum: Ne 31. decembra 23:07:15 2017 -0800
Môj záväzok 11
spáchať 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Autor: Zak H
Dátum: ne 31. decembra 23:07:13 2017 -0800
Môj záväzok 10
spáchať a33e366ad9f6004a61a468b48b36e0c0c802a815
Autor: Zak H
Dátum: ne 31. decembra 23:07:11 2017 -0800
Môj záväzok 9
spáchať ead472d61f516067983d7e29d548fc856d6e6868
Autor: Zak H
Dátum: ne 31. decembra 23:07:09 2017 -0800
Môj záväzok 8
spáchať 8995d427668768af88266f1e78213506586b0157
Autor: Zak H
Dátum: ne 31. decembra 23:07:07 2017 -0800
Moje spáchanie 7 (v1.0.2)
spáchať be3b341559752e733c6392a16d6e87b5af52e701
Autor: Zak H
Dátum: Ne 31. decembra 23:07:05 2017 -0800
Môj záväzok 6
spáchať c54b58ba8f73fb464222f30c90aa72f60b99bda9
Autor: Zak H
Dátum: ne 31. decembra 23:07:03 2017 -0800
Moje spáchanie 5 (v1.0.1)
spáchať 264267111643ef5014e92e23fd2f306a10e93a64
Autor: Zak H
Dátum: Ne 31. decembra 23:07:01 2017 -0800
Môj záväzok 4
potvrdiť cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Autor: Zak H
Dátum: ne 31. decembra 23:06:59 2017 -0800
Môj záväzok 3
spáchať 3f90793b631ddce7be509c36b0244606a2c0e8ad
Autor: Zak H
Dátum: ne 31. decembra 23:06:57 2017 -0800
Moje spáchanie 2 (v1.0.0)
spáchať cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Autor: Zak H
Dátum: ne 31. decembra 23:06:55 2017 -0800
Môj záväzok 1
Dokonca aj pri niekoľkých málo potvrdeniach môžete vidieť, že je ťažké presne určiť spáchanie, ktoré spustilo chybu.
Nájdenie chyby
Použime git log -online na zobrazenie vyčistenejšej verzie histórie potvrdenia.
$ git log - online3023b63 Môj záväzok 17
10ef028 Moje spáchanie 16
598d4c4 Moje potvrdenie 15 (v1.0.4)
b9678b7 Moje spáchanie 14
eb3f2f7 Moje potvrdenie 13
3cb475a Moje potvrdenie 12 (v1.0.3)
0419a38 Môj záväzok 11
15bc592 Môj záväzok 10
a33e366 Moje potvrdenie 9
ead472d Moje potvrdenie 8
8995d42 Moje potvrdenie 7 (v1.0.2)
be3b341 Môj záväzok 6
c54b58b Moje potvrdenie 5 (v1.0.1)
2642671 Môj záväzok 4
cfd7127 Moje potvrdenie 3
3f90793 Moje potvrdenie 2 (v1.0.0)
cc163ad Moje potvrdenie 1
Chceme nájsť situáciu, keď riadok „Tu je môj zlý kód 1 <- BUG INTRODUCED HERE” entered the picture.
Situácia 1
Predpokladajme, že si pamätáme, že náš kód bol dobrý až do verzie 1.0.2 a chceme skontrolovať od tohto okamihu až do posledného potvrdenia. Najprv spustíme príkaz bisect:
$ git bisect štartPoskytujeme dobrú a zlú hranicu (žiadny hash neznamená najnovší kód):
$ git bisect dobrý 8995d42$ git bisect zlé
Výkon:
Rozdelenie: po tomto zostávajú na testovanie 4 revízie (zhruba 2 kroky)[3cb475a4693b704793946a878007b40a1ff67cd1] Môj záväzok 12 (v1.0.3)
Príkaz bisect našiel stredný bod v našom definovanom rozsahu a automaticky presunul kód na potvrdenie 12. Náš kód môžeme teraz otestovať. V našom prípade vypíšeme obsah testu.TXT:
$ test mačky.TXTVýkon:
Tu je môj dobrý kód 1Tu je môj dobrý kód 2
Tu je môj dobrý kód 3
Tu je môj dobrý kód 4
Tu je môj dobrý kód 5
Tu je môj dobrý kód 6
Tu je môj dobrý kód 7
Tu je môj dobrý kód 8
Tu je môj zlý kód 1 <-- BUG INTRODUCED HERE
Tu je môj zlý kód 2
Tu je môj zlý kód 3
Tu je môj zlý kód 4
Vidíme, že stav testu.txt je v stave po chybe. Takže je to v zlom stave. Dali sme teda vedieť príkazu bisect:
$ git bisect zléVýkon:
Rozdelenie: Po tomto zostávajú na testovanie 2 revízie (zhruba 1 krok)[a33e366ad9f6004a61a468b48b36e0c0c802a815] Môj záväzok 9
Posúva náš kód k spáchaniu 9. Opäť testujeme:
$ test mačky.TXTVýkon:
Tu je môj dobrý kód 1Tu je môj dobrý kód 2
Tu je môj dobrý kód 3
Tu je môj dobrý kód 4
Tu je môj dobrý kód 5
Tu je môj dobrý kód 6
Tu je môj dobrý kód 7
Tu je môj dobrý kód 8
Tu je môj zlý kód 1 <-- BUG INTRODUCED HERE
Vidíme, že sme našli východiskový bod chyby. Vinník je spáchanie „a33e366 My commit 9“.
Nakoniec všetko vrátime do normálu:
$ git bisect vynulovanýVýkon:
Predchádzajúca pozícia HEAD bola a33e366 ... Môj záväzok 9Prepnuté na pobočku „hlavný“
Situácia 2
V rovnakom príklade skúsme situáciu, keď iný vývojár začne s predpokladom, že chyba bola zavedená medzi verziou v1.0.0 a v1.0.3. Proces môžeme začať znova:
$ git bisect štart$ git bisect dobrý 3f90793
$ git bisect zlý 3cb475a
Výkon:
Rozdelenie: po tomto zostávajú na testovanie 4 revízie (zhruba 2 kroky)[8995d427668768af88266f1e78213506586b0157] Môj záväzok 7 (v1.0.2)
Bisect presunul náš kód na spáchanie 7 alebo v1.0.2. Spustíme náš test:
$ test mačky.TXTVýkon:
Tu je môj dobrý kód 1Tu je môj dobrý kód 2
Tu je môj dobrý kód 3
Tu je môj dobrý kód 4
Tu je môj dobrý kód 5
Tu je môj dobrý kód 6
Tu je môj dobrý kód 7
Nevidíme žiadny zlý kód. Dajte teda vedieť git bisect:
$ git bisect dobrýVýkon:
Rozdelenie: Po tomto zostávajú na testovanie 2 revízie (zhruba 1 krok)[a33e366ad9f6004a61a468b48b36e0c0c802a815] Môj záväzok 9
Posunulo nás to k spáchaniu 9. Opäť testujeme:
$ test mačky.TXTVýkon:
Tu je môj dobrý kód 1Tu je môj dobrý kód 2
Tu je môj dobrý kód 3
Tu je môj dobrý kód 4
Tu je môj dobrý kód 5
Tu je môj dobrý kód 6
Tu je môj dobrý kód 7
Tu je môj dobrý kód 8
Tu je môj zlý kód 1 <-- BUG INTRODUCED HERE
Opäť sme našli potvrdenie, ktoré chybu zaviedlo. Bol to záväzok „a33e366 Môj záväzok 9“. Aj keď sme začali s rôznym rozsahom podozrení, v niekoľkých krokoch sme našli tú istú chybu.
Obnovme nastavenie:
$ git bisect vynulovanýVýkon:
Predchádzajúca pozícia HEAD bola a33e366 ... Môj záväzok 9Prepnuté na pobočku „hlavný“
Záver
Ako vidíte z príkladu, git bisect nám umožňuje rýchlejšie určiť problém. Je to skvelý nástroj na zvýšenie vašej produktivity. Namiesto toho, aby ste prešli celou históriou záväzkov, môžete k ladeniu zvoliť systematickejší prístup.
Ďalšie štúdium:
https: // git-scm.com / docs / git-bisect
https: // git-scm.com / book / en / v2 / Git-Tools-Debugging-with-Git