Git bisect: Kaip atpažinti kodo klaidą?

Šiame straipsnyje apie „git bisect“ sužinokite, kaip komanda „git bisect“ padeda nustatyti pirmąjį blogą įsipareigojimą, kuriame pateikiama klaida naudojant dvejetainį paieškos algoritmą.

Mano kodas veikė gerai iki vakar, bet tik tol, kol neseniai ištraukęs iš nuotolinės saugyklos nesulaužė kodo !!!

Jei esate panašioje situacijoje ir nežinote koks pokytis sulaužė kodą arba PSO iš daugelio prisidedančiųjų priklauso tai klaida / funkcija , tada „git bisect“ yra jūsų išeitis. Taigi, šiame straipsnyje apie „git bisect“ sužinosite, kaipgit dvipusis‘Ateina komanda gelbėjimas nustatant pirmąjį blogą įsipareigojimą, kuris pateikia klaidą naudodamas dvejetainio paieškos algoritmą.



Šiame straipsnyje aptariamos šios temos:



kaip padaryti failą Java

Kodėl verta naudoti git bisect?

Nėra jokių abejonių dėl to, kad esate linkęs sukurti daugybę įsipareigojimų kiekvienam nedideliam pasikeitimui . Tokiu atveju derinimas su kodu tampa varginančia užduotimi, nes jūs turite rankiniu būdu grįžti laiku į kiekvieną projekto momentinės nuotraukos peržiūrą, kad išbandytumėte veikiantį kodą ir aptiktumėte klaidą. Dabar tai dar daugiau kompleksas kai jūs turite kito darbo, kurį norite patikrinti be pagrindinio taško, taip pat paprašyti kiekvieno išvalyti savo klaidas, taip pat skamba nelabai įmanoma.
Be to, jūs taip pat galite sukurti ir išmesti keletą „funkcinių“ (arba karštųjų pataisų) šakų šiame procese ir galų gale sugaišti laiką ir pastangas, nukrypstant nuo pagrindinės vystymosi linijos.



Taigi, norėdami išvengti tokių scenarijų, galite naudotigit dvipusiskomandą surasti blogą projekto pataisą (arba momentinę nuotrauką) ir galiausiai ją ištaisyti naudojantgit grįžtikomandą.

Kaip ieškoma „git bisect“?



Ši komanda dalijasi pusiau (padalija) savo istoriją tarp Gerai ir blogai įsipareigoti diapazonas. Tai rodo tavo srovė projektą valstija į a vidutinės klasės įsipareigoti momentinė nuotrauka. Tada pereinama „git bisect“ komanda kiekvieno įsipareigojimo ID tarp šio diapazono, kol stabtelėjęs kiekvienoje momentinėje nuotraukoje, kad galėtumėte tai padaryti išbandyti kodą . Jei klaida yra, jūs paskelbiate įsipareigojimą kaip blogai, jei ne kaip Gerai nebent paieška baigsis.

Sintaksė

git dvipusis

Norėdami geriau suprasti „git bisect“, sukurkime projektą, kuriame sukurtas paprastos navigacijos programos, naudojamos automobilyje, kodas.

Pradinė projekto sąranka

Norėdami sukurti projektą, kuriame sukurtas paprastos navigacijos programos, naudojamos automobilyje, kodas, galite atlikti šiuos veiksmus:

1 žingsnis: Sukurkite naują katalogą savo aplanke $ HOME:

cd $ HOME mkdir my_nav_app

2 žingsnis: Eikite į naują katalogą:

cd $ my_nav_app

3 žingsnis: Klonuokite ir atsisiųskite projektą iš mano „GitHub“ puslapio:

„git“ klonas https://github.com/divyabhushan/my_nav_app.git

Dabar supraskime projektų katalogus ir failų išdėstymą, išspausdintus komanda:ls -lTR

„Source Code Layout“ - „Git Bisect“ - „Edureka“

Tada pažiūrėkime apie projekto istorijos žurnalą, kad peržiūrėtume įsipareigojimus, kuriuos padariau norėdamas sugeneruoti šį kodą.

Pavyzdžiui, paprasta „git log“ komanda išsamiai išspausdina istoriją, tačiau man patinka gražiai formatuoti ir pritaikyti istoriją. Taigi leisk mums nustatyti slapyvardį - „hist“ naudojant git pseudonimas komanda, kaip parodyta žemiau:

git alias.hist 'log --pretty = format:'% C (geltona)% h% Creset% ad | % C (žalia)% s% Creset% C (raudona)% d% Creset% C (mėlyna) [% an] '--graph --decorate --date = short'

Dabar aš atliksiu šią klaidų taisymo funkciją atskirame filiale, kad netrukdyčiau pagrindinei „pagrindinio“ šakos plėtrai. Norėdami tai padaryti, vykdykite toliau nurodytą komandų rinkinį:

  • Sukurti filialą „dev“: [meistras] $git filialas dev
  • Perjungti į „dev“ filialą: $git checkout dev
  • Išvardykite istorijos žurnalus: [dev] $eiti hist[Pastaba: čia naudojama „alias“ komanda]

Be to, aš pabrėžiau paskutinį žinomą gerą įsipareigojimą, kurį žinau, kai mano scenarijus veikė gerai, su tikėtinais bandymų atvejais. Šis įsipareigojimų momentinis vaizdas yra pažymėta kaip v1.0.

Taigi, dabar, kai žinome savo paskutinį gerą įsipareigojimą, eikime į priekį šiame straipsnyje apie „git bisect“ ir išbandykite programą.

Išbandykite programą

Paleiskite scenarijų kaip - $./scripts/myApplication.sh[bandymas pirmą kartą]



Aišku, mano dabartinė projekto būsena yra klaida , ir aš nesu tikras, kokį pasikeitimą padariau atlikdamas įsipareigojimą. Taigi, šiame straipsnyje apie „git bisect“, pažiūrėkime, kaip nustatyti blogą įsipareigojimą.

Blogo įsipareigojimo nustatymas

Norėdami pradėti tikrinti, ar nėra blogo įsipareigojimo, atlikite šiuos veiksmus:

  • Paleiskite komandą bisect :git bisect start
  • Paminėkite blogo įsipareigojimo ID: git pusiau bloga GALVAarbagit bisect c5b3ca8
  • Paminėkite paskutinį žinomą gero įsipareigojimo ID: „git“ padalykite į dvi dalis gerą v1.0arba„git bisect“ 93859d8

Tai padalija įsipareigojimų istorijos intervalą maždaug pusiaukelėje tarp gerų ir blogų įsipareigojimų, kurie mus atveda prie įsipareigojimų ID: f61a7e8

Vadinasi, komanda patikrino projekto versiją, kuri buvo šiame įsipareigojimų ID. Dabar leiskite mums tęsti ir dar kartą išbandyti savo paraišką.

Komanda paleisti programą : $./scripts/myApplication.sh[bandymas antrą kartą]


Nuo taikymo praėjo šiame įsipareigojime šis įsipareigojimas tikrai nėra blogas įsipareigojimas. Taigi, jūs turite pranešti tą patį komandai bisect kaip - $git bisect geras


Dabar tai dar labiau susiaurins paieškos rezultatus į pirmąją diapazono pusę, kaip parodyta -


Dar kartą išbandykite savo programą - komanda: $./scripts/myApplication.sh[bandymas trečią kartą]


Taigi, kadangi matome klaidą, kaip nurodyta aukščiau, tai yra blogas įsipareigojimas.

Praneškite komandai bisect, paleiskite $git bisect blogas


Tai dar labiau susiaurina paiešką ir patenka į paskutinį mėlyną apjuostą vidurinį pakeitimą: a6ac769

Taigi paskutinį kartą išbandau savo programą naudodamas tą pačią komandą: $./scripts/myApplication.sh[bandymas ketvirtą kartą]

Kadangi programa vėl nepavyko, tai vis tiek yra blogas įsipareigojimas. Taigi leidžia paleisti šią komandą:

Paleiskite komandą: git bisect blogas

Rastas blogas įsipareigojimas

Tai užbaigia vienintelį likusį blogą įsipareigojimą


Taigi žinote, kad čia sugedo kodas. Kas toliau?

Supraskite, kokiame faile buvo klaida

Tokiu atveju išvestis suteikia jums minimalią informaciją apie įsipareigoti ID , autoriaus vardas , ir autoriaus data kartu su įvykdyti pranešimą ir kelias kad buvo modifikuota.

Jei norite toliau derinti, jums reikia skaityti įvykdyti id objektą .

Komanda: „git show“ a6ac76994b3f6c7519204f910fc787b7928cf8ef

Taip bus perskaitytas „object“ objektas ir išspausdintas žurnalo pranešimas ir teksto diff.

Taip pat galite naudoti komandą „git blame“, kad išanalizuotumėte, kaip ir kuriame įsipareigojime kiekvienas autorius pakeitė kiekvieną eilutę, vykdykite komandą taip:„git“ kaltinimo kodas / develop_nav.sh

Sustabdykite paiešką

Norėdami sustabdyti paiešką, naudokite šią komandą:

Komanda: git bisect reset


Taigi pjovimo procesas yra sustabdytas ir jūs vėl esate filiale, nuo kurio pradėjote paiešką. Dabar kitas žingsnis yra pataisyti arba derinti kodą.

Kaip pataisyti / derinti kodą?

Na, yra keli būdai, kuriuos galėtumėte padaryti, kad išspręstumėte dabartinę projekto būklę dabar, kai nustatėte įsipareigojimą, kuris pirmiausia atnešė klaidą.
Tačiau, jei keičiate įsipareigojimą dėl bendra saugykla tai geriausia grįžti pakeitimas naudojant „ git grįžti ‘Komanda.

Užduotis: Grąžinkite minėto blogo įsipareigojimo atliktus pakeitimus

Komanda: git revert a6ac769

Todėl šio įsipareigojimo pakeitimų atšaukimas padarė 2 veiksmus:

  • Jis ištrynė paskutines 3 pridėtas eilutes (pažymėtas žalia spalva) ir pridėjo ištrintas eilutes (nurodytas raudonai) atgal. (atvirkštinė a6ac769)
  • Sukurtas papildomas įsipareigojimas su pranešimo grąžinimo informacija

„Grąžinti komandą taip pat lengviau sekti pakeitimą, kurį grąžinote iš pradinio įsipareigojimo“

Naudoti 'Rodyti' komandą dar kartą perskaityti objekto ID, pvz.,

Komanda: git šou 801f029

Dabar eikite į priekį ir išbandykite programą. Tai bus tinkamai vykdoma.

Komanda: $./scripts/myApplication.sh

kas yra „sqlite“ naršyklė

Priešingai, jei norite pašalinti blogą įsipareigojimą iš istorijos:

  • Galite naudoti git atstatyti „Komanda su„--sunku“(Nors nerekomenduojama bendroje saugykloje).

  • Patikrinkite ankstesnę vieno failo versiją naudodami „git kasa„Komanda su„-‘Variantas.

Reikėtų pažymėti, kad tai pakeis jūsų vietinę saugyklą tik tol, kol nustumsite pakeitimus į nuotolinę saugyklą. Kadangi kai kurie pakeitimai sukuria naują įsipareigojimo objekto ID, kaip ir anksčiau, tokiais atvejais įprastas nuotolinės saugyklos siuntimas atmetamas, nes istorija būtų išsiskyrusi. Turite naudoti „ git stumti „Komanda su„- jėga‘Variantas.

Atnaujinkite „pagrindinį“ filialą

Nors aš pašalinau klaidą savo „dev“ šakoje, dabar taip pat galiu sujungti šį pakeitimą su „master“ filialu.

  • pereiti į „master“, komanda:git kasos meistras
  • traukite naujausius naujinimus iš „origin / master“ į „master“, komanda:git pull kilmė
  • sujungti „dev“ pakeitimus, komanda:git sulieti milžinas

Tačiau sujungus gali kilti konfliktų, jei yra daugiau įsipareigojimų iš nuotolinės saugyklos. Išspręskite konfliktus ir tęskite susijungimą.
Galiausiai stumkite tik stabilų „pagrindinį“ filialą, kuris įsipareigoja nuotolinei saugyklai, o jūsų nešvarus darbas (klaida, funkcijos, patobulinimai) atliekamas tik tose funkcijų šakose, kaip „dev“ šiame pavyzdyje.
Be to, geriausia priimti logišką šakojimosi strategija supaprastinti ir apsaugoti savo „git“ darbo eigos procesą.

Apibendrinant, 'git bisect' yra patogi ir naudinga komanda, kuri greitai nustatyti įsipareigoti ID kad įvesta į kaltė savo bėgimo kodą, naudodamas išsamų dvejetainė paieška logiškai dalijantis įsipareigojimų žurnalai pusiaukelėje tarp Gerai ir blogai įsipareigoti diapazonas . Pabaigai jūs išmokote aptikti ydingas įsipareigojimas ir grįžti jo padarytą pakeitimą.

Be pakomandžių „geras“ ir „blogas“, pataisymo būsenai apibūdinti taip pat galite naudoti tokius terminus kaip naujas ir senas. Galite kelis kartus paleisti komandą, perduodami skirtingus pakomandžius ir pataisymo / vykdymo ID, kad nustatytumėte skirtingus įsipareigojimų (she-1) ID. Arba taip pat galima paleisti automatinį bandomąjį scenarijų, kad būtų sukurtas sugadintas kodas naudojant šią komandą. Be to, paleisdami raskite išsamų šios komandos aprašymągit bisect - pagalbaterminale. Taigi, žmonės, tuo užsiėmę, baigėme šį straipsnį apie „Git Bisect“.

„DevOps“ tikslas yra greičiau ir patikimiau sukurti geresnės kokybės programinę įrangą, tuo pačiu pakviečiant didesnį komandų bendravimą ir bendradarbiavimą. Jei jus domina šis straipsnis, c Heck out sukūrė patikima internetinė mokymosi įmonė „Edureka“, turinti daugiau nei 250 000 patenkintų besimokančiųjų tinklą visame pasaulyje. „Edureka DevOps“ sertifikavimo mokymo kursas padeda besimokantiesiems suprasti, kas yra „DevOps“, ir įgyti patirties įvairiuose „DevOps“ procesuose ir įrankiuose, pvz., „Puppet“, „Jenkins“, „Nagios“, „Ansible“, „Chef“, „Saltstack“ ir „GIT“, skirtuose automatizuoti kelis SDLC veiksmus.

Turite mums klausimą? Prašau tai paminėti straipsnio „Git Bisect“ komentarų skyriuje ir mes susisieksime su jumis kuo greičiau.