Git

Výukový program Git Bisect

Výukový program Git Bisect
Komentování vašich závazků je nezbytnou součástí udržování sledovatelného kódu. Pomůže vám sledovat problémy. Nalezení chyby pouze na základě komentářů je však zdlouhavý úkol. Může trvat dlouhou dobu, než se setkáte s celou historií a zjistíte, které spáchání je viníkem.

Příkaz git bisect poskytuje způsob, jak urychlit proces detekce chyb. Umožní vám to přesněji určit problém. Pomocí git bisect můžete definovat řadu revizí, u kterých máte podezření, že mají problematický kód, a poté pomocí binárních eliminačních metod najít začátek problému. Hledání chyb je rychlejší a jednodušší.

Pojďme nastavit příklad a spustit několik testovacích případů, abychom zjistili, jak to funguje.

Příklad instalace

V našem příkladu vytvoříme test.Soubor txt a při každém potvrzení přidejte do souboru nový řádek. Po 16 potvrzeních bude konečný stav souboru vypadat takto:

Tady je můj dobrý kód 1
Tady je můj dobrý kód 2
Tady je můj dobrý kód 3
Tady je můj dobrý kód 4
Tady je můj dobrý kód 5
Tady je můj dobrý kód 6
Tady je můj dobrý kód 7
Tady je můj dobrý kód 8
Tady je můj špatný kód 1 <-- BUG INTRODUCED HERE
Tady je můj špatný kód 2
Tady je můj špatný kód 3
Tady je můj špatný kód 4
Tady je můj špatný kód 5
Tady je můj špatný kód 6
Tady je můj špatný kód 7
Tady je můj špatný kód 8
Tady je můj špatný kód 9

Ve výše uvedeném příkladu se chyba dostala do kódu po 8 provizích. Pokračovali jsme ve vývoji kódu i po zavedení chyby.

Můžete vytvořit složku s názvem my_bisect_test a pomocí následujících příkazů uvnitř složky vytvořit příklad situace:

git init
echo "Tady je můj dobrý kód 1"> test.txt
git add -A && git commit -m "My commit 1"
echo "Tady je můj dobrý kód 2" >> test.txt
git add -A && git commit -m "Moje potvrzení 2 (v1.0.0) „
echo "Tady je můj dobrý kód 3" >> test.txt
git add -A && git commit -m "My commit 3"
echo "Tady je můj dobrý kód 4" >> test.txt
git add -A && git commit -m "My commit 4"
echo "Tady je můj dobrý kód 5" >> test.txt
git add -A && git commit -m "My commit 5 (v1.0.1) „
echo "Tady je můj dobrý kód 6" >> test.txt
git add -A && git commit -m "My commit 6"
echo "Tady je můj dobrý kód 7" >> test.txt
git add -A && git commit -m "My commit 7 (v1.0.2) „
echo "Tady je můj dobrý kód 8" >> test.txt
git add -A && git commit -m "My commit 8"
echo "Tady je můj špatný kód 1"> test.txt
git add -A && git commit -m "My commit 9"
echo "Tady je můj špatný kód 2" >> test.txt
git add -A && git commit -m "Moje potvrzení 10"
echo "Tady je můj špatný kód 3" >> test.txt
git add -A && git commit -m "My commit 11"
echo "Tady je můj špatný kód 4" >> test.txt
git add -A && git commit -m "Moje potvrzení 12 (v1.0.3) „
echo "Tady je můj špatný kód 5" >> test.txt
git add -A && git commit -m "My commit 13"
echo "Tady je můj špatný kód 6" >> test.txt
git add -A && git commit -m "Moje potvrzení 14"
echo "Tady je můj špatný kód 7" >> test.txt
git add -A && git commit -m "My commit 15 (v1.0.4) „
echo "Tady je můj špatný kód 8" >> test.txt
git add -A && git commit -m "My commit 16"

Kontrola historie

Pokud se podíváte na historii revizí, uvidíte následující:

$ git log
odevzdat 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Autor: Zak H
Datum: Ne 31. prosince 23:07:27 2017-0800
Můj závazek 17
spáchat 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Autor: Zak H
Datum: Ne 31. prosince 23:07:25 2017-0800
Můj závazek 16
spáchat 598d4c4acaeb14cda0552b6a92aa975c436d337a
Autor: Zak H
Datum: Ne 31. prosince 23:07:23 2017-0800
Můj závazek 15 (v1.0.4)
spáchat b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Autor: Zak H
Datum: Ne 31. prosince 23:07:21 2017-0800
Můj závazek 14
spáchat eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Autor: Zak H
Datum: Ne 31. prosince 23:07:19 2017-0800
Můj závazek 13
spáchat 3cb475a4693b704793946a878007b40a1ff67cd1
Autor: Zak H
Datum: Ne 31. prosince 23:07:17 2017-0800
Moje potvrzení 12 (v1.0.3)
spáchat 0419a38d898e28c4db69064478ecab7736700310
Autor: Zak H
Datum: Ne 31. prosince 23:07:15 2017-0800
Můj závazek 11
spáchat 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Autor: Zak H
Datum: Ne 31. prosince 23:07:13 2017-0800
Můj závazek 10
spáchat a33e366ad9f6004a61a468b48b36e0c0c802a815
Autor: Zak H
Datum: Ne 31. prosince 23:07:11 2017-0800
Můj závazek 9
spáchat ead472d61f516067983d7e29d548fc856d6e6868
Autor: Zak H
Datum: Ne 31. prosince 23:07:09 2017-0800
Můj závazek 8
spáchat 8995d427668768af88266f1e78213506586b0157
Autor: Zak H
Datum: Ne 31. prosince 23:07:07 2017-0800
Moje potvrzení 7 (v1.0.2)
odevzdat be3b341559752e733c6392a16d6e87b5af52e701
Autor: Zak H
Datum: Ne 31. prosince 23:07:05 2017-0800
Můj závazek 6
spáchat c54b58ba8f73fb464222f30c90aa72f60b99bda9
Autor: Zak H
Datum: Ne 31. prosince 23:07:03 2017-0800
Moje potvrzení 5 (v1.0.1)
spáchat 264267111643ef5014e92e23fd2f306a10e93a64
Autor: Zak H
Datum: Ne 31. prosince 23:07:01 2017-0800
Můj závazek 4
spáchat cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Autor: Zak H
Datum: Ne 31. prosince 23:06:59 2017-0800
Můj závazek 3
odevzdat 3f90793b631ddce7be509c36b0244606a2c0e8ad
Autor: Zak H
Datum: Ne 31. prosince 23:06:57 2017-0800
Moje potvrzení 2 (v1.0.0)
spáchat cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Autor: Zak H
Datum: Ne 31. prosince 23:06:55 2017-0800
Můj závazek 1

I při pouhé hrstce revizí vidíte, že je obtížné přesně určit revizi, která chybu spustila.


Hledání chyby

Pojďme použít git log -online k zobrazení více vyčištěné verze historie potvrzení.

$ git log - online
3023b63 Můj závazek 17
10ef028 Moje potvrzení 16
598d4c4 My commit 15 (v1.0.4)
b9678b7 Moje potvrzení 14
eb3f2f7 Moje potvrzení 13
3cb475a Moje potvrzení 12 (v1.0.3)
0419a38 Můj závazek 11
15bc592 Moje potvrzení 10
a33e366 Moje potvrzení 9
ead472d Moje potvrzení 8
8995d42 My commit 7 (v1.0.2)
be3b341 Moje potvrzení 6
c54b58b Moje potvrzení 5 (v1.0.1)
2642671 Moje potvrzení 4
cfd7127 Moje potvrzení 3
3f90793 My commit 2 (v1.0.0)
cc163ad Moje potvrzení 1

Chceme najít situaci, kdy řádek „Tady je můj špatný kód 1 <- BUG INTRODUCED HERE” entered the picture.

Situace 1

Předpokládejme, že si pamatujeme, že náš kód byl dobrý až do verze 1.0.2 a chceme zkontrolovat od tohoto okamžiku až do posledního potvrzení. Nejprve spustíme příkaz bisect:

$ git bisect start

Poskytujeme dobrou hranici a špatnou hranici (žádný hash znamená nejnovější kód):

$ git bisect dobrý 8995d42
$ git bisect špatný

Výstup:

Po půlení: Zbývají k testování 4 revize (zhruba 2 kroky)
[3cb475a4693b704793946a878007b40a1ff67cd1] Moje potvrzení 12 (v1.0.3)

Příkaz bisect našel prostřední bod v našem definovaném rozsahu a automaticky přesunul kód ke spáchání 12. Náš kód můžeme nyní otestovat. V našem případě budeme vydávat obsah testu.txt:

$ kočičí test.txt

Výstup:

Tady je můj dobrý kód 1
Tady je můj dobrý kód 2
Tady je můj dobrý kód 3
Tady je můj dobrý kód 4
Tady je můj dobrý kód 5
Tady je můj dobrý kód 6
Tady je můj dobrý kód 7
Tady je můj dobrý kód 8
Tady je můj špatný kód 1 <-- BUG INTRODUCED HERE
Tady je můj špatný kód 2
Tady je můj špatný kód 3
Tady je můj špatný kód 4

Vidíme, že stav zkoušky.txt je ve stavu po chybě. Takže je ve špatném stavu. Dali jsme tedy vědět příkazu bisect:

$ git bisect špatný

Výstup:

Po půlení: Po tomto testu zbývají 2 revize (zhruba 1 krok)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Moje potvrzení 9

Přesune náš kód ke spáchání 9. Znovu testujeme:

$ kočičí test.txt

Výstup:

Tady je můj dobrý kód 1
Tady je můj dobrý kód 2
Tady je můj dobrý kód 3
Tady je můj dobrý kód 4
Tady je můj dobrý kód 5
Tady je můj dobrý kód 6
Tady je můj dobrý kód 7
Tady je můj dobrý kód 8
Tady je můj špatný kód 1 <-- BUG INTRODUCED HERE

Vidíme, že jsme našli výchozí bod chyby. Pachatel „a33e366 My commit 9“ je viníkem.

Nakonec vše vrátíme do normálu:

$ git bisect reset

Výstup:

Předchozí pozice HEAD byla a33e366 ... Můj závazek 9
Přepnuto na větev „master“

Situace 2

Ve stejném příkladu zkusme situaci, kdy jiný vývojář začíná předpokladem, že chyba byla zavedena mezi verzí 1.0.0 a v1.0.3. Můžeme zahájit proces znovu:

$ git bisect start
$ git bisect dobrý 3f90793
$ git bisect špatný 3cb475a

Výstup:

Po půlení: Zbývají k testování 4 revize (zhruba 2 kroky)
[8995d427668768af88266f1e78213506586b0157] Moje potvrzení 7 (v1.0.2)

Bisect přesunul náš kód k potvrzení 7 nebo v1.0.2. Provedeme náš test:

$ kočičí test.txt

Výstup:

Tady je můj dobrý kód 1
Tady je můj dobrý kód 2
Tady je můj dobrý kód 3
Tady je můj dobrý kód 4
Tady je můj dobrý kód 5
Tady je můj dobrý kód 6
Tady je můj dobrý kód 7

Nevidíme žádný špatný kód. Dejte tedy git bisect vědět:

$ git bisect dobrý

Výstup:

Po půlení: Po tomto testu zbývají 2 revize (zhruba 1 krok)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Moje potvrzení 9

Přesunulo nás to k spáchání 9. Znovu testujeme:

$ kočičí test.txt

Výstup:

Tady je můj dobrý kód 1
Tady je můj dobrý kód 2
Tady je můj dobrý kód 3
Tady je můj dobrý kód 4
Tady je můj dobrý kód 5
Tady je můj dobrý kód 6
Tady je můj dobrý kód 7
Tady je můj dobrý kód 8
Tady je můj špatný kód 1 <-- BUG INTRODUCED HERE

Opět jsme našli potvrzení, které chybu zavedlo. Jednalo se o potvrzení „a33e366 My commit 9“. I když jsme začali s různým rozsahem podezření, našli jsme stejnou chybu v několika krocích.

Pojďme resetovat:

$ git bisect reset

Výstup:

Předchozí pozice HEAD byla a33e366 ... Můj závazek 9
Přepnuto na větev „master“

Závěr

Jak vidíte z příkladu, git bisect nám umožňuje určit problém rychleji. Je to skvělý nástroj pro zvýšení vaší produktivity. Místo procházení celé historie revizí můžete k ladění zaujmout systematičtější přístup.

Další studie:

https: // git-scm.com / docs / git-bisect
https: // git-scm.com / book / en / v2 / Git-Tools-Debugging-with-Git

Hry SuperTuxKart pro Linux
SuperTuxKart pro Linux
SuperTuxKart je skvělý titul navržený tak, aby vám ve vašem systému Linux přinesl zážitek Mario Kart zdarma. Je to docela náročné a zábavné hrát, je n...
Hry Výukový program Battle for Wesnoth
Výukový program Battle for Wesnoth
The Battle for Wesnoth je jednou z nejpopulárnějších strategických her s otevřeným zdrojovým kódem, které si v tuto chvíli můžete zahrát. Tato hra se ...
Hry 0 A.D. Tutorial
0 A.D. Tutorial
Z mnoha strategických her venku je 0 A.D. dokáže vyniknout jako komplexní titul a velmi hluboká, taktická hra, přestože je otevřeným zdrojem. Vývoj hr...