Dibaging sa Git-om

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.

alt

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?

  1. Prvo, krenimo sa binarnim režimom pretraživanja da bismo pronašli grešku: $ git bisect start.
  2. 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
  1. Označi najstariji "dobar" commit SHA-1: $ git bisect good 95d69a1.
  2. 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.
  3. 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.
  4. 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.