Git

Výukový program pre Git Bisect

Výukový program pre Git Bisect
Komentovanie vašich záväzkov je nevyhnutnou súčasťou zachovania sledovateľného kódu. Pomáha vám sledovať problémy. Nájsť chybu iba na základe komentárov je však únavná úloha. Môže trvať dlho, kým sa zorientujete v celej histórii a zistíte, kto je vinníkom.

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 1
Tu 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 init
echo "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 log
spá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 - online
3023b63 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 štart

Poskytujeme 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.TXT

Výkon:

Tu je môj dobrý kód 1
Tu 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.TXT

Výkon:

Tu je môj dobrý kód 1
Tu 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 9
Prepnuté 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.TXT

Výkon:

Tu je môj dobrý kód 1
Tu 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.TXT

Výkon:

Tu je môj dobrý kód 1
Tu 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 9
Prepnuté 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

Hry Ako zobraziť počítadlo FPS v hrách Linux
Ako zobraziť počítadlo FPS v hrách Linux
Hranie na systéme Linux získalo veľký tlak, keď spoločnosť Valve v roku 2012 oznámila podporu systému Linux pre klienta Steam a ich hry. Od tej doby s...
Hry Ako sťahovať a prehrávať Sid Meier's Civilization VI v systéme Linux
Ako sťahovať a prehrávať Sid Meier's Civilization VI v systéme Linux
Úvod do hry Civilization 6 predstavuje moderné poňatie klasického konceptu predstaveného v sérii hier Age of Empires. Myšlienka bola dosť jednoduchá; ...
Hry Ako inštalovať a hrať Doom na Linuxe
Ako inštalovať a hrať Doom na Linuxe
Úvod do Doom Séria Doom vznikla v 90. rokoch po vydaní pôvodného Doomu. Bol to okamžitý hit a od tej doby herná séria získala množstvo ocenení a origi...