Dibaging sa Git-om
Kada radite na velikom projektu, u kodu ćete otkriti greške koje vas sprečavaju da nastavite dalje u razvoju. Kako ih popraviti?
Možete započeti ručnim pregledom istorije commit-ovanja, ali ovo bi na kraju završilo kao vrlo zamoran proces. Srećom, Git ima više alata koji vam mogu pomoći u lovu na grešku ili krivca kada stvari pođu po zlu.
Git Blame
$ git blame <file_path/file_name>
Naredba git blame
vam pomaže da pronađete commit koji je kreirao određenu liniju koda koja uzrokuje grešku u određenoj datoteci projekta. Takođe određuje autora commit-a, što olakšava traženje više informacija o kodu.
Možete koristiti -L opciju da ograničite opseg linije izlaza.
$ git blame -L 11,21 new_file
^95d69a196b5c7 (Jhon Smith 2018-05-18 13:04:22 +0200 11) def new
^95d69a196b5c7 (Jhon Smith 2018-05-18 13:04:22 +0200 12) @article = Article.new
^95d69a196b5c7 (Jhon Smith 2018-05-18 13:04:22 +0200 13) end
3171aa2dbbce7 (David Smith 2018-05-16 18:21:30 +0200 14) def edit
3171aa2dbbce7 (David Smith 2018-05-16 18:21:30 +0200 15) @article = Article.find(params[:id])
3171aa2dbbce7 (David Smith 2018-05-16 18:21:30 +0200 16) end
^95d69a196b5c7 (Jhon Smith 2018-05-18 13:04:22 +0200 17) def create
3171aa2dbbce7 (David Smith 2018-05-16 18:21:30 +0200 18) @article = Article.new(article_params)
^95d69a196b5c7 (Jhon Smith 2018-05-18 13:04:22 +0200 19) if @article.save
^95d69a196b5c7 (Jhon Smith 2018-05-18 13:04:22 +0200 20) redirect_to @article
^95d69a196b5c7 (Jhon Smith 2018-05-18 13:04:22 +0200 21) else
Prateći delimični SHA-1 commit možete lako videti ko je, kada i kako promenio određeni red koda. Imajte na umu da prefiks ^
prikazuje linije koje su kreirane u početnom commit-u i od tada su ostale nepromenjene.
Koristite opciju -C da biste shvatili odakle su prvobitno došli fragmenti koda ako su kopirani sa drugog mesta. Kaže vam originlog autora i commit-ove se bez obzira na naknadnu refaktorizaciju.
$ git blame -L -C 11,21 <file_path/file_name>
git blame
je koristan kada možete pretpostaviti uzrok problema. Šta ako niste imali ideju kako da se vratite u radno stanje? Ovde nastupa git bisect
.
Git Bisect
git bisect
je alatka za otklanjanje grešaka koja se koristi za automatsko binarno pretraživanje da bi se otkrilo koji je određeni commit doveo do greške ili problema u projektu. Ne znate koja datoteka u projektu sadrži grešku.
Ako ne znate šta je problem, a od poslednjeg stanja u kome znate da je kod radio postoji mnogo commit-ova, verovatno ćete se obratiti za pomoć git bisect
.
Ono što git bisect
čini je, deli stablo git commit-a na „dobre“, bez grešaka i „loše“, testirajući ih binarnom pretragom. Na osnovu rezultata testova, Git se kreće kroz nedavne commit-ove identifikujući ih, dok ne pronađe krivca. Ovo je poznato kao binarni algoritam pretraživanja.
Ako imate više grešaka, morate izvršiti binarnu pretragu svake greške.
Kako to radi?
- Prvo, krenimo sa binarnim režimom pretraživanja da bismo pronašli grešku:
$ git bisect start.
- Dalje, trebate potražiti commit tamo gde je sve još uvek funkcionisalo. Da bismo to uradili, ispitajmo istoriju commit-ova da bismo pronašli ono što vam treba:
$ git log --oneline
.
--oneline opcija prikazuje samo imena git urezivanja.
$ git log --oneline
f11c599 Removed unnecessary lines
95d69a1 Added article tests
3171aa2 Enabled editing articles
95d69a1 Added articles
- Označi najstariji "dobar" commit SHA-1:
$ git bisect good 95d69a1
. - Nakon što označite „dobar“ tag, morate pronaći „loš“ commit da biste podelili stablo commit-ova gde Git može primeniti binarni algoritam pretraživanja. Budući da znate da najnoviji commit-ovi imaju grešku, dodijelićete ga kao „loš“ commit:
$ git bisect bad f11c599
. - Jednom kada dodelite početne i završne pokazivače za vašu pretragu, Git vas vodi kroz istoriju commit-ova i označava „dobre“ i „loše“ commit-ove.
- Ovaj proces se nastavlja sve dok uspešno ne otkrijete prvi „loš“ commit, uzrok vašeg problema. Sada možete napustiti git binarni režim pretraživanja izvršavanjem:
$ git bisect reset
.
Git Grep
$ git grep <keyword>
Komanda git grep
vam omogućava efikasno i brzo pretraživanje niza ili regularnog izraza u projektu u bilo kojoj od datoteka u vašem izvornom kodu. Izbegava pretraživanje .gitignore
datoteka.
GREP je skraćenica od Global Regular Expression Print.
Dodatne opcije:
-n
ili--line-number
: Štampa brojeve linija gde je Git pronašao podudaranja.-i
ili--ignore-case
: Zanemaruje razlike između velikih i malih slova između pretraživane ključne reči i datoteke.-c
ili--count
: Prikazuje broj podudaranja pronađenih u datoteci za unetu ključnu reč.-p
ili--shov-function
: Prikazuje kontekst pretraživane ključne reči.--and
: Osigurava više podudaranja u istom redu teksta.
Rezime
git blame
je odličan alat ako znate gde se nalazi greška. S druge strane, ako je vaš repozitorijum znatn veliki, sa ogromnom istorijom commit-ova koja otežava pronalaženje greške, git bisect
je pravi način. Ili možete lako pretražiti niz projekata ili string ili regularni izraz pomoću git grep
.
Tri alata za otklanjanje grešaka na tri različita načina za rešavanje problema na svoje jedinstvene načine. Sa kojim ste se do sada susreli? Podelite svoje iskustvo!
Bagovi, greške i problemi sa kodiranjem znamo kako da ih rešimo sve! Pretplatite se i naučite naše posebne tehnike.