Git

Git Bisect Vadnica

Git Bisect Vadnica
Komentiranje vaših zavez je bistveni del vzdrževanja sledljive kode. Pomaga vam pri sledenju težavam. Vendar pa je iskanje napake samo na podlagi komentarjev dolgočasno. Dolgo lahko razčlenimo vso zgodovino in ugotovimo, katera zaveza je krivec.

Ukaz git bisect ponuja način za pospešitev postopka zaznavanja napak. Omogoča vam hitrejše določanje težave. S sistemom git bisect lahko določite vrsto zaveze, za katere sumite, da imajo problematično kodo, in nato z binarnimi metodami odstranjevanja poiščete začetek težave. Iskanje napak je hitrejše in lažje.

Postavimo primer in zaženimo nekaj testnih primerov, da vidimo, kako deluje.

Primer nastavitve

V našem primeru bomo ustvarili test.txt in dodajte datoteko z vsako vrstico v vsako vrstico. Po 16 sprejemih bo končno stanje datoteke videti tako:

Tu je moja dobra koda 1
Tu je moja dobra koda 2
Tu je moja dobra koda 3
Tu je moja dobra koda 4
Tu je moja dobra koda 5
Tu je moja dobra koda 6
Tu je moja dobra koda 7
Tu je moja dobra koda 8
Tu je moja slaba koda 1 <-- BUG INTRODUCED HERE
Tu je moja slaba koda 2
Tu je moja slaba koda 3
Tu je moja slaba koda 4
Tu je moja slaba koda 5
Tu je moja slaba koda 6
Tu je moja slaba koda 7
Tu je moja slaba koda 8
Tu je moja slaba koda 9

V zgornjem primeru je napaka prišla v kodo po 8 prevzemih. Kodo smo razvijali tudi po predstavitvi napake.

Ustvarite lahko mapo z imenom my_bisect_test in z naslednjimi ukazi znotraj mape ustvarite primer primera:

git init
echo "Tu je moja dobra koda 1"> test.txt
git add -A && git commit -m "Moj prevzem 1"
echo "Tu je moja dobra koda 2" >> test.txt
git add -A && git commit -m "Moj prevzem 2 (v1.0.0) "
echo "Tu je moja dobra koda 3" >> test.txt
git add -A && git commit -m "Moj prevzem 3"
echo "Tu je moja dobra koda 4" >> test.txt
git add -A && git commit -m "Moj prevzem 4"
echo "Tu je moja dobra koda 5" >> test.txt
git add -A && git commit -m "Moj prevzem 5 (v1.0.1) "
echo "Tu je moja dobra koda 6" >> test.txt
git add -A && git commit -m "Moj prevzem 6"
echo "Tu je moja dobra koda 7" >> test.txt
git add -A && git commit -m "Moj prevzem 7 (v1.0.2) "
echo "Tu je moja dobra koda 8" >> test.txt
git add -A && git commit -m "Moj prevzem 8"
echo "Tu je moja slaba koda 1"> test.txt
git add -A && git commit -m "Moj prevzem 9"
echo "Tu je moja slaba koda 2" >> test.txt
git add -A && git commit -m "Moj prevzem 10"
echo "Tu je moja slaba koda 3" >> test.txt
git add -A && git commit -m "Moj prevzem 11"
echo "Tu je moja slaba koda 4" >> test.txt
git add -A && git commit -m "Moj prevzem 12 (v1.0.3) "
echo "Tu je moja slaba koda 5" >> test.txt
git add -A && git commit -m "Moj prevzem 13"
echo "Tu je moja slaba koda 6" >> test.txt
git add -A && git commit -m "Moj prevzem 14"
echo "Tu je moja slaba koda 7" >> test.txt
git add -A && git commit -m "Moj prevzem 15 (v1.0.4) "
echo "Tu je moja slaba koda 8" >> test.txt
git add -A && git commit -m "Moj prevzem 16"

Preverjanje zgodovine

Če pogledate zgodovino prevzemov, vidite naslednje:

$ git log
zaveži 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:27 2017 -0800
Moja obveznost 17
objavi 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:25 2017 -0800
Moja obveznost 16
zaveži 598d4c4acaeb14cda0552b6a92aa975c436d337a
Avtor: Zak H
Datum: nedelja 31. december 23:07:23 2017 -0800
Moj prevzem 15 (v1.0.4)
zaveži b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:21 2017 -0800
Moja obveznost 14
zaveži se eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:19 2017 -0800
Moja obveznost 13
zaveži 3cb475a4693b704793946a878007b40a1ff67cd1
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:17 2017 -0800
Moj prevzem 12 (v1.0.3)
zaveži 0419a38d898e28c4db69064478ecab7736700310
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:15 2017 -0800
Moja obveznost 11
objavi 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Avtor: Zak H
Datum: nedelja 31. december 23:07:13 2017 -0800
Moja obveznost 10
zaveži a33e366ad9f6004a61a468b48b36e0c0c802a815
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:11 2017 -0800
Moja obveznost 9
zaveži ead472d61f516067983d7e29d548fc856d6e6868
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:09 2017 -0800
Moja obveznost 8
zaveži 8995d427668768af88266f1e78213506586b0157
Avtor: Zak H
Datum: nedelja 31. december 23:07:07 2017 -0800
Moja objava 7 (v1.0.2)
zaveži se be3b341559752e733c6392a16d6e87b5af52e701
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:05 2017 -0800
Moja obveznost 6
zaveži c54b58ba8f73fb464222f30c90aa72f60b99bda9
Avtor: Zak H
Datum: nedelja 31. december 23:07:03 2017 -0800
Moja objava 5 (v1.0.1)
zaveži 264267111643ef5014e92e23fd2f306a10e93a64
Avtor: Zak H
Datum: nedelja 31. decembra 23:07:01 2017 -0800
Moja obveznost 4
zaveži cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Avtor: Zak H
Datum: nedelja 31. decembra 23:06:59 2017 -0800
Moja obveznost 3
zaveži 3f90793b631ddce7be509c36b0244606a2c0e8ad
Avtor: Zak H
Datum: nedelja 31. decembra 23:06:57 2017 -0800
Moja objava 2 (v1.0.0)
zaveži cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Avtor: Zak H
Datum: nedelja 31. decembra 23:06:55 2017 -0800
Moja obveznost 1

Tudi s samo nekaj prevzemi lahko vidite, da je težko natančno določiti predajo, ki je sprožila napako.


Iskanje hrošča

Uporabite git log -online, da si ogledate bolj očiščeno različico zgodovine predaj.

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

Ugotoviti želimo situacijo, ko se v vrstici »Tu je moja slaba koda 1 <- BUG INTRODUCED HERE” entered the picture.

Situacija 1

Recimo, da se spomnimo, da je bila naša koda dobra do v1.0.2 in želimo preveriti od tega trenutka do zadnjega sprejema. Najprej zaženemo ukaz bisect:

$ git bisect start

Navajamo dobro in slabo mejo (nobena zgoščena oznaka ne pomeni najnovejše kode):

$ git razpolovilo dobro 8995d42
$ git bisect slabo

Izhod:

Razdeljevanje: po tem ostanejo še 4 revizije (približno 2 koraka)
[3cb475a4693b704793946a878007b40a1ff67cd1] Moj prevzem 12 (v1.0.3)

Ukaz bisect je našel srednjo točko v našem definiranem obsegu in samodejno premaknil kodo, da se zaveže 12. Zdaj lahko preizkusimo svojo kodo. V našem primeru bomo izdali vsebino testa.txt:

$ mačji test.txt

Izhod:

Tu je moja dobra koda 1
Tu je moja dobra koda 2
Tu je moja dobra koda 3
Tu je moja dobra koda 4
Tu je moja dobra koda 5
Tu je moja dobra koda 6
Tu je moja dobra koda 7
Tu je moja dobra koda 8
Tu je moja slaba koda 1 <-- BUG INTRODUCED HERE
Tu je moja slaba koda 2
Tu je moja slaba koda 3
Tu je moja slaba koda 4

Vidimo, da je stanje testa.txt je v stanju po napak. Torej je v slabem stanju. Ukaz bisect torej obvestimo:

$ git bisect slabo

Izhod:

Razčlenjevanje: po tem sta preostali še dve reviziji (približno 1 korak)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Moj prevzem 9

Našo kodo premakne v 9. Ponovno preizkusimo:

$ mačji test.txt

Izhod:

Tu je moja dobra koda 1
Tu je moja dobra koda 2
Tu je moja dobra koda 3
Tu je moja dobra koda 4
Tu je moja dobra koda 5
Tu je moja dobra koda 6
Tu je moja dobra koda 7
Tu je moja dobra koda 8
Tu je moja slaba koda 1 <-- BUG INTRODUCED HERE

Vidimo, da smo našli izhodišče napake. Krivec je zaveza »a33e366 My commit 9«.

Končno vse postavimo v normalno stanje z:

$ git bisect reset

Izhod:

Prejšnji položaj HEAD je bil a33e366… Moj prevzem 9
Preklopljeno na vejo 'master'

Stanje 2

V istem primeru poskusimo v primeru, ko drug razvijalec začne s predpostavko, da je bila napaka uvedena med različico v1.0.0 in v1.0.3. Postopek lahko začnemo znova:

$ git bisect start
$ git razpolovi dobro 3f90793
$ git bisect bad 3cb475a

Izhod:

Razdeljevanje: po tem ostanejo še 4 revizije (približno 2 koraka)
[8995d427668768af88266f1e78213506586b0157] Moj prevzem 7 (v1.0.2)

Bisect je našo kodo premaknil v obveznost 7 ali v1.0.2. Zaženimo test:

$ mačji test.txt

Izhod:

Tu je moja dobra koda 1
Tu je moja dobra koda 2
Tu je moja dobra koda 3
Tu je moja dobra koda 4
Tu je moja dobra koda 5
Tu je moja dobra koda 6
Tu je moja dobra koda 7

Ne vidimo slabe kode. Torej, sporočite git bisect:

$ git se razpolovi dobro

Izhod:

Razčlenjevanje: po tem sta preostali še dve reviziji (približno 1 korak)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Moj prevzem 9

Premaknil nas je k zavezi 9. Ponovno preizkusimo:

$ mačji test.txt

Izhod:

Tu je moja dobra koda 1
Tu je moja dobra koda 2
Tu je moja dobra koda 3
Tu je moja dobra koda 4
Tu je moja dobra koda 5
Tu je moja dobra koda 6
Tu je moja dobra koda 7
Tu je moja dobra koda 8
Tu je moja slaba koda 1 <-- BUG INTRODUCED HERE

Ponovno smo našli zavezo, ki je uvedla napako. Bil je prevzem »a33e366 Moj prevzem 9«. Čeprav smo začeli z različnim obsegom sumov, smo v nekaj korakih našli isto napako.

Ponastavimo:

$ git bisect reset

Izhod:

Prejšnji položaj HEAD je bil a33e366 ... Moj prevzem 9
Preklopljeno na vejo 'master'

Zaključek

Kot lahko vidite iz primera, git bisect nam omogoča, da hitreje določimo težavo. Je odlično orodje za povečanje vaše produktivnosti. Namesto da bi se ukvarjali s celotno zgodovino prevzemov, lahko sistemsko odpravite napake.

Nadaljni študij:

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

Kako povečati FPS v Linuxu?
FPS pomeni Število sličic na sekundo. Naloga FPS je merjenje hitrosti sličic pri predvajanju video posnetkov ali igranih predstavah. Z enostavnimi bes...
Najboljše laboratorijske igre Oculus App
Če ste lastnik slušalk Oculus, morate biti seznanjeni s stranskim nalaganjem. Sideloading je postopek namestitve vsebine, ki ni shranjena v slušalke. ...
10 najboljših iger za igranje v Ubuntuju
Platforma Windows je bila ena izmed prevladujočih platform za igre na srečo zaradi velikega odstotka iger, ki se danes razvijajo za naravno podporo si...