Git

Vodič za Git Bisect

Vodič za Git Bisect
Komentiranje vaših obveza važan je dio održavanja sljedivog koda. Pomaže vam u praćenju problema. Međutim, pronalazak greške samo na osnovu komentara dosadan je zadatak. Može potrajati puno vremena da se sortira cijela povijest i shvati koji je počinitelj krivac.

Naredba git bisect pruža način za ubrzavanje postupka otkrivanja grešaka. Omogućuje vam brže utvrđivanje problema. Pomoću git bisect možete definirati niz predanosti za koje sumnjate da imaju problematični kôd, a zatim binarnim metodama eliminacije pronaći početak problema. Pronalaženje bugova postaje brže i lakše.

Postavimo primjer i pokrenimo nekoliko testnih slučajeva da vidimo kako to funkcionira.

Primjer postavljanja

U našem primjeru stvorit ćemo test.txt datoteku i dodajte novi redak u datoteku sa svakim urezivanjem. Nakon 16 izvršavanja, konačno stanje datoteke izgledat će ovako:

Evo mog dobrog koda 1
Evo mog dobrog koda 2
Evo mog dobrog koda 3
Evo mog dobrog koda 4
Evo mog dobrog koda 5
Evo mog dobrog koda 6
Evo mog dobrog koda 7
Evo mog dobrog koda 8
Evo mog lošeg koda 1 <-- BUG INTRODUCED HERE
Evo mog lošeg koda 2
Evo mog lošeg koda 3
Evo mog lošeg koda 4
Evo mog lošeg koda 5
Evo mog lošeg koda 6
Evo mog lošeg koda 7
Evo mog lošeg koda 8
Evo mog lošeg koda 9

U gornjem primjeru greška je ušla u kod nakon 8 izvršavanja. Kôd smo nastavili razvijati čak i nakon uvođenja programske pogreške.

Možete stvoriti mapu pod nazivom my_bisect_test i upotrijebiti sljedeće naredbe iz mape da biste stvorili primjer situacije:

git init
echo "Evo mog dobrog koda 1"> test.txt
git add -A && git commit -m "Moj predati 1"
echo "Evo mog dobrog koda 2" >> test.txt
git add -A && git commit -m "Moj predati 2 (v1.0.0) "
echo "Evo mog dobrog koda 3" >> test.txt
git add -A && git commit -m "My commit 3"
echo "Evo mog dobrog koda 4" >> test.txt
git add -A && git commit -m "Moj odabir 4"
echo "Evo mog dobrog koda 5" >> test.txt
git add -A && git commit -m "Moj predati 5 (v1.0.1) "
echo "Evo mog dobrog koda 6" >> test.txt
git add -A && git commit -m "Moj predaj 6"
echo "Evo mog dobrog koda 7" >> test.txt
git add -A && git commit -m "Moj predati 7 (v1.0.2) "
echo "Evo mog dobrog koda 8" >> test.txt
git add -A && git commit -m "Moj odabir 8"
echo "Evo mog lošeg koda 1"> test.txt
git add -A && git commit -m "My commit 9"
echo "Evo mog lošeg koda 2" >> test.txt
git add -A && git commit -m "Moj predati 10"
echo "Evo mog lošeg koda 3" >> test.txt
git add -A && git commit -m "Moj predati 11"
echo "Evo mog lošeg koda 4" >> test.txt
git add -A && git commit -m "Moj odabir 12 (v1.0.3) "
echo "Evo mog lošeg koda 5" >> test.txt
git add -A && git commit -m "Moj odabir 13"
echo "Evo mog lošeg koda 6" >> test.txt
git add -A && git commit -m "Moj odabir 14"
echo "Evo mog lošeg koda 7" >> test.txt
git add -A && git commit -m "Moj predati 15 (v1.0.4) "
echo "Evo mog lošeg koda 8" >> test.txt
git add -A && git commit -m "Moj predati 16"

Provjera povijesti

Ako pogledate povijest obveza, vidjet ćete sljedeće:

$ git zapisnik
predati 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Autor: Zak H
Datum: Nedjelja 31. prosinca 23:07:27 2017 -0800
Moj počiniti 17
predati 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Autor: Zak H
Datum: Ned 31.12 23:07:25 2017 -0800
Moj počinak 16
predati 598d4c4acaeb14cda0552b6a92aa975c436d337a
Autor: Zak H
Datum: Nedjelja 31. prosinca 23:07:23 2017 -0800
Moj predati 15 (v1.0.4)
predati b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Autor: Zak H
Datum: Nedjelja 31. prosinca 23:07:21 2017 -0800
Moja obveza 14
predati eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Autor: Zak H
Datum: Nedjelja 31. prosinca 23:07:19 2017 -0800
Moj počinak 13
predati 3cb475a4693b704793946a878007b40a1ff67cd1
Autor: Zak H
Datum: Ned 31.12 23:07:17 2017 -0800
Moj predati 12 (v1.0.3)
predati 0419a38d898e28c4db69064478ecab7736700310
Autor: Zak H
Datum: Ned 31.12 23:07:15 2017 -0800
Moj počinak 11
predati 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Autor: Zak H
Datum: Nedjelja 31. prosinca 23:07:13 2017 -0800
Moja obveza 10
obvezati a33e366ad9f6004a61a468b48b36e0c0c802a815
Autor: Zak H
Datum: Ned 31.12 23:07:11 2017 -0800
Moj počinak 9
predati ead472d61f516067983d7e29d548fc856d6e6868
Autor: Zak H
Datum: Ned 31.12 23:07:09 2017 -0800
Moj počinak 8
počini 8995d427668768af88266f1e78213506586b0157
Autor: Zak H
Datum: Nedjelja 31. prosinca 23:07:07 2017 -0800
Moj predati 7 (v1.0.2)
predati be3b341559752e733c6392a16d6e87b5af52e701
Autor: Zak H
Datum: Ned 31.12 23:07:05 2017 -0800
Moja obveza 6
predati c54b58ba8f73fb464222f30c90aa72f60b99bda9
Autor: Zak H
Datum: Ned 31.12 23:07:03 2017 -0800
Moj predati 5 (v1.0.1)
predati 264267111643ef5014e92e23fd2f306a10e93a64
Autor: Zak H
Datum: Ned 31.12 23:07:01 2017 -0800
Moja obveza 4
predati cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Autor: Zak H
Datum: Ned 31.12 23:06:59 2017 -0800
Moja obveza 3
predati 3f90793b631ddce7be509c36b0244606a2c0e8ad
Autor: Zak H
Datum: Ned 31.12 23:06:57 2017 -0800
Moj zapis 2 (v1.0.0)
predati cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Autor: Zak H
Datum: Ned 31.12 23:06:55 2017 -0800
Moja obveza 1

Čak i sa samo nekolicinom predavanja, možete vidjeti da je teško točno odrediti predavanje koje je pokrenulo pogrešku.


Pronalaženje Bug

Upotrijebimo git log -online kako bismo vidjeli čišću verziju povijesti urezivanja.

$ git log --oneline
3023b63 Moj počiniti 17
10ef028 Moj predati 16
598d4c4 Moj popravak 15 (v1.0.4)
b9678b7 Moj popravak 14
eb3f2f7 Moj popravak 13
3cb475a Moj popravak 12 (v1.0.3)
0419a38 Moj počiniti 11
15bc592 Moj predati 10
a33e366 Moj počiniti 9
ead472d Moj počiniti 8
8995d42 Moj popravak 7 (v1.0.2)
be3b341 Moj počiniti 6
c54b58b Moj popravak 5 (v1.0.1)
2642671 Moj počiniti 4
cfd7127 Moj predati 3
3f90793 Moj predati 2 (v1.0.0)
cc163ad Moj predati 1

Želimo pronaći situaciju u kojoj se redak „Evo mog lošeg koda 1 <- BUG INTRODUCED HERE” entered the picture.

Situacija 1

Pretpostavimo da se sjećamo da je naš kod bio dobar do v1.0.2 i želimo provjeriti od tog trenutka do najnovijeg urezivanja. Prvo započinjemo naredbu bisect:

$ git bisect start

Pružamo dobru i lošu granicu (bez hasha znači najnoviji kôd):

$ git dvosječno dobro 8995d42
$ git bisect loše

Izlaz:

Dijeljenje na dvoje: preostalo je 4 revizije nakon testiranja (otprilike 2 koraka)
[3cb475a4693b704793946a878007b40a1ff67cd1] Moj predavanje 12 (v1.0.3)

Naredba bisect pronašla je srednju točku u našem definiranom opsegu i automatski premjestila kôd da preda 12. Sada možemo testirati naš kod. U našem ćemo slučaju objaviti sadržaj testa.txt:

$ mačji test.txt

Izlaz:

Evo mog dobrog koda 1
Evo mog dobrog koda 2
Evo mog dobrog koda 3
Evo mog dobrog koda 4
Evo mog dobrog koda 5
Evo mog dobrog koda 6
Evo mog dobrog koda 7
Evo mog dobrog koda 8
Evo mog lošeg koda 1 <-- BUG INTRODUCED HERE
Evo mog lošeg koda 2
Evo mog lošeg koda 3
Evo mog lošeg koda 4

Vidimo da je stanje testa.txt je u stanju nakon buga. Dakle, u lošem je stanju. Tako dajemo na znanje naredbi bisect:

$ git bisect loše

Izlaz:

Dvosječno dijeljenje: preostale su dvije revizije za testiranje nakon ovoga (otprilike 1 korak)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Moj prijam 9

Premješta naš kod u urezivanje 9. Ponovno testiramo:

$ mačji test.txt

Izlaz:

Evo mog dobrog koda 1
Evo mog dobrog koda 2
Evo mog dobrog koda 3
Evo mog dobrog koda 4
Evo mog dobrog koda 5
Evo mog dobrog koda 6
Evo mog dobrog koda 7
Evo mog dobrog koda 8
Evo mog lošeg koda 1 <-- BUG INTRODUCED HERE

Vidimo da smo pronašli početnu točku greške. Krivac je počinio "a33e366 Moj počinio 9".

Konačno, sve vraćamo u normalu:

Poništavanje $ git bisect

Izlaz:

Prethodni položaj HEAD bio je a33e366… Moj popravak 9
Prebačeno na granu 'master'

Situacija 2

U istom primjeru, pokušajmo sa situacijom kada drugi programer započne s premisom da je bug uveden između v1.0.0 i v1.0.3. Postupak možemo započeti ponovno:

$ git bisect start
$ git dvosječno dobro 3f90793
$ git bisect loše 3cb475a

Izlaz:

Dijeljenje na dvoje: preostalo je 4 revizije nakon testiranja (otprilike 2 koraka)
[8995d427668768af88266f1e78213506586b0157] Moj prijam 7 (v1.0.2)

Bisect je premjestio naš kôd kako bi počinio 7 ili v1.0.2. Pokrenimo naš test:

$ mačji test.txt

Izlaz:

Evo mog dobrog koda 1
Evo mog dobrog koda 2
Evo mog dobrog koda 3
Evo mog dobrog koda 4
Evo mog dobrog koda 5
Evo mog dobrog koda 6
Evo mog dobrog koda 7

Ne vidimo nikakav loš kod. Dakle, obavijestite git bisect:

$ git dijeli dobro

Izlaz:

Dvosječno dijeljenje: preostale su dvije revizije za testiranje nakon ovoga (otprilike 1 korak)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Moj prijam 9

Potaknuo nas je da počinimo 9. Ponovno testiramo:

$ mačji test.txt

Izlaz:

Evo mog dobrog koda 1
Evo mog dobrog koda 2
Evo mog dobrog koda 3
Evo mog dobrog koda 4
Evo mog dobrog koda 5
Evo mog dobrog koda 6
Evo mog dobrog koda 7
Evo mog dobrog koda 8
Evo mog lošeg koda 1 <-- BUG INTRODUCED HERE

Ponovno smo pronašli predaju koja je uvela bug. Bio je to urezivanje “a33e366 Moj popravak 9”. Iako smo započeli s različitim rasponom sumnje, u nekoliko smo koraka pronašli istu grešku.

Ponovno postavimo:

Poništavanje $ git bisect

Izlaz:

Prethodni položaj HEAD bio je a33e366… Moj popravak 9
Prebačeno na granu 'master'

Zaključak

Kao što možete vidjeti iz primjera, git bisect omogućuje nam brže utvrđivanje problema. To je izvrstan alat za povećanje vaše produktivnosti. Umjesto da prolazite kroz cijelu povijest obveza, možete pristupiti sustavnijem pristupu otklanjanju pogrešaka.

Daljni studiji:

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

5 najboljih arkadnih igara za Linux
U današnje vrijeme računala su ozbiljni strojevi koji se koriste za igre na sreću. Ako ne uspijete dobiti novi visoki rezultat, znat ćete na što misli...
Bitka za Wesnoth 1.13.6 Razvoj objavljen
Bitka za Wesnoth 1.13.6 objavljeno prošlog mjeseca, šesto je razvojno izdanje u izdanju 1.13.x series i donosi niz poboljšanja, ponajviše korisničkog ...
Kako instalirati League Of Legends na Ubuntu 14.04
Ako ste ljubitelj League of Legends, ovo je prilika za vas da testirate League of Legends. Imajte na umu da je LOL podržan na PlayOnLinux ako ste kori...