Git

„Git Bisect“ mokymo programa

„Git Bisect“ mokymo programa
Komentuoti savo įsipareigojimus yra būtina norint išlaikyti atsekamą kodą. Tai padeda atsekti problemas. Tačiau rasti klaidą remiantis vien komentarais yra varginanti užduotis. Gali užtrukti ilgai, kol surūšiuoti visą istoriją ir išsiaiškinti, kuris įsipareigojimas yra kaltininkas.

„Git bisect“ komanda suteikia galimybę pagreitinti klaidų aptikimo procesą. Tai leidžia greičiau nustatyti problemą. Naudodami „git bisect“ galite apibrėžti įsipareigojimų, kuriuos įtariate turėdami probleminį kodą, diapazoną ir tada naudoti dvejetainius šalinimo metodus, kad rastumėte problemos pradžią. Klaidų paieška tampa greitesnė ir paprastesnė.

Pateikime pavyzdį ir paleiskime keletą bandomųjų atvejų, kad pamatytume, kaip jis veikia.

Sąrankos pavyzdys

Savo pavyzdyje sukursime testą.txt failą ir prie kiekvieno įsipareigojimo pridėkite naują eilutę prie failo. Po 16 įsipareigojimų galutinė failo būsena atrodys taip:

Štai mano geras kodas 1
Štai mano geras kodas 2
Štai mano geras kodas 3
Čia yra mano geras kodas 4
Čia yra mano geras kodas 5
Čia yra mano geras kodas 6
Štai mano geras kodas 7
Štai mano geras kodas 8
Štai mano blogasis kodas 1 <-- BUG INTRODUCED HERE
Štai mano blogasis kodas 2
Čia yra mano blogas kodas 3
Čia yra mano blogas kodas 4
Čia yra mano blogas kodas 5
Čia yra mano blogas kodas 6
Štai mano blogasis kodas 7
Štai mano blogas kodas 8
Štai mano blogas kodas 9

Ankstesniame pavyzdyje klaida pateko į kodą po 8 įsipareigojimų. Mes ir toliau tobulinome kodą net įvedę klaidą.

Galite sukurti aplanką „my_bisect_test“ ir naudodamiesi šiomis komandomis aplanko viduje sukurkite pavyzdinę situaciją:

git init
aidas "Čia yra mano geras kodas 1"> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 1"
aidas „Čia mano geras kodas 2“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 2 (v1.0.0) "
aidas „Čia mano geras kodas 3“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 3"
aidas „Čia mano geras kodas 4“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 4"
aidas „Čia mano geras kodas 5“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 5 (v1.0.1) "
aidas „Čia mano geras kodas 6“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 6"
aidas „Štai mano geras kodas 7“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 7 (v1.0.2) "
aidas „Čia mano geras kodas 8“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 8"
aidas "Čia mano blogas kodas 1"> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 9"
aidas „Čia mano blogas kodas 2“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 10"
aidas „Čia mano blogas kodas 3“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 11"
aidas „Čia mano blogas kodas 4“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 12 (v1.0.3) "
aidas „Čia mano blogas kodas 5“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 13"
aidas „Čia mano blogas kodas 6“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 14"
aidas „Čia mano blogas kodas 7“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 15 (v1.0.4) "
aidas „Čia mano blogas kodas 8“ >> testas.txt
git add -A && git įsipareigoti -m "Mano įsipareigojimas 16"

Istorijos tikrinimas

Pažvelgę ​​į įvykdytų įvykių istoriją matote:

$ git žurnalas
įsipareigoti 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:27, 2017 m. - 0800
Mano įsipareigojimas 17
įsipareigoti 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Autorius: Zak H
Data: sekmadienis, gruodžio 31 d. 23:07:25, 2017 -0800
Mano įsipareigojimas 16
įsipareigoti 598d4c4acaeb14cda0552b6a92aa975c436d337a
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:23, 2017 m. - 0800
Mano įsipareigojimas 15 (v1.0.4)
įsipareigoti b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Autorius: Zak H
Data: sekmadienis, gruodžio 31 d. 23:07:21, 2017 -0800
Mano įsipareigojimas 14
įsipareigoti eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:19, 2017 m. - 0800
Mano įsipareigojimas 13
įsipareigoti 3cb475a4693b704793946a878007b40a1ff67cd1
Autorius: Zak H
Data: sekmadienis, gruodžio 31 d. 23:07:17, 2017 -0800
Mano įsipareigojimas 12 (v1.0.3)
įsipareigoti 0419a38d898e28c4db69064478ecab7736700310
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:15, 2017-0800
Mano įsipareigojimas 11
įsipareigoti 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:13, 2017 m. - 0800
Mano įsipareigojimas 10
įvykdyti a33e366ad9f6004a61a468b48b36e0c0c802a815
Autorius: Zak H
Data: sekmadienis, gruodžio 31 d. 23:07:11, 2017 -0800
Mano įsipareigojimas 9
įvykdyti ead472d61f516067983d7e29d548fc856d6e6868
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:09, 2017-08-08
Mano įsipareigojimas 8
įsipareigoti 8995d427668768af88266f1e78213506586b0157
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:07, 2017-08-08
Mano įsipareigojimas 7 (v1.0.2)
įsipareigoti be3b341559752e733c6392a16d6e87b5af52e701
Autorius: Zak H
Data: sekmadienis, gruodžio 31 d. 23:07:05, 2017 -0800
Mano įsipareigojimas 6
įsipareigoti c54b58ba8f73fb464222f30c90aa72f60b99bda9
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:03, 2017-08-08
Mano įsipareigojimas 5 (v1.0.1)
įsipareigoti 264267111643ef5014e92e23fd2f306a10e93a64
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:07:01, 2017 m. - 0800
Mano įsipareigojimas 4
įsipareigoti cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:06:59, 2017 m. - 0800
Mano įsipareigojimas 3
įsipareigoti 3f90793b631ddce7be509c36b0244606a2c0e8ad
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:06:57, 2017 m. –0800
Mano įsipareigojimas 2 (v1.0.0)
įsipareigoti cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Autorius: Zak H
Data: 2017 m. Gruodžio 31 d. 23:06:55, 2017-0800
Mano įsipareigojimas 1

Net turėdami tik keletą įsipareigojimų, galite pastebėti, kad sunku nustatyti įsipareigojimą, kuris pradėjo klaidą.


Rasti klaidą

Panaudokime „git log -online“, kad pamatytume labiau išvalytą įsipareigojimų istorijos versiją.

$ git žurnalas - tiesioginis
3023b63 Mano įsipareigojimas 17
10ef028 Mano įsipareigojimas 16
598d4c4 Mano įsipareigojimas 15 (v1.0.4)
b9678b7 Mano įsipareigojimas 14
eb3f2f7 Mano įsipareigojimas 13
3cb475a Mano įsipareigojimas 12 (v1.0.3)
0419a38 Mano įsipareigojimas 11
15bc592 Mano įsipareigojimas 10
a33e366 Mano įsipareigojimas 9
mano įsipareigojimas 8
8995d42 Mano įsipareigojimas 7 (v1.0.2)
be3b341 Mano įsipareigojimas 6
c54b58b Mano įsipareigojimas 5 (v1.0.1)
2642671 Mano įsipareigojimas 4
cfd7127 Mano įsipareigojimas 3
3f90793 Mano įsipareigojimas 2 (v1.0.0)
cc163ad Mano įsipareigojimas 1

Norime rasti situaciją, kai eilutė „Čia mano blogas kodas 1 <- BUG INTRODUCED HERE” entered the picture.

1 situacija

Tarkime, mes prisimename, kad mūsų kodas buvo geras iki v1.0.2 ir mes norime patikrinti nuo tos akimirkos iki paskutinio įsipareigojimo. Pirmiausia paleidžiame komandą bisect:

$ git pradėkite dvi dalis

Pateikiame gerą ir blogą ribą (be maišos reiškia naujausią kodą):

$ git padalykite į dvi dalis gerai 8995d42
$ git bisect blogai

Išvestis:

Padalijimas: po to liko išbandyti 4 pataisas (maždaug 2 žingsniai)
[3cb475a4693b704793946a878007b40a1ff67cd1] Mano įsipareigojimas 12 (v1.0.3)

„Bisect“ komanda surado vidurinį tašką mūsų apibrėžtame diapazone ir automatiškai perkėlė kodą, kad įvykdytų 12. Dabar galime išbandyti savo kodą. Mūsų atveju mes pateiksime testo turinį.txt:

$ katės testas.txt

Išvestis:

Štai mano geras kodas 1
Štai mano geras kodas 2
Štai mano geras kodas 3
Čia yra mano geras kodas 4
Čia yra mano geras kodas 5
Čia yra mano geras kodas 6
Štai mano geras kodas 7
Štai mano geras kodas 8
Štai mano blogasis kodas 1 <-- BUG INTRODUCED HERE
Štai mano blogasis kodas 2
Čia yra mano blogas kodas 3
Čia yra mano blogas kodas 4

Mes matome, kad bandymo būsena.txt yra po klaidos būsenos. Taigi jis yra blogos būklės. Taigi mes pranešėme komandai „bisect“:

$ git dalykite blogai

Išvestis:

Padalijimas: po to liko išbandyti 2 pakeitimus (maždaug 1 žingsnis)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Mano įsipareigojimas 9

Jis perkelia mūsų kodą į 9. Mes dar kartą išbandome:

$ katės testas.txt

Išvestis:

Štai mano geras kodas 1
Štai mano geras kodas 2
Štai mano geras kodas 3
Čia yra mano geras kodas 4
Čia yra mano geras kodas 5
Čia yra mano geras kodas 6
Štai mano geras kodas 7
Štai mano geras kodas 8
Štai mano blogasis kodas 1 <-- BUG INTRODUCED HERE

Matome, kad radome pradinį klaidos tašką. Įsipareigojimas „a33e366 Mano įsipareigojimas 9“ yra kaltininkas.

Galiausiai viską normalizavome:

$ git iš naujo nustatykite dvi dalis

Išvestis:

Ankstesnė HEAD pozicija buvo a33e366 ... Mano įsipareigojimas 9
Perjungtas į filialo „master“

2 situacija

Tame pačiame pavyzdyje išbandykime situaciją, kai kitas kūrėjas pradeda nuo prielaidos, kad klaida buvo įvesta tarp v1.0.0 ir v1.0.3. Mes galime pradėti procesą iš naujo:

$ git pradėkite dvi dalis
$ git padalykite pusiau gerą 3f90793
$ git padalykite blogai 3cb475a

Išvestis:

Padalijimas: po to liko išbandyti 4 pataisas (maždaug 2 žingsniai)
[8995d427668768af88266f1e78213506586b0157] Mano įsipareigojimas 7 (v1.0.2)

„Bisect“ perkėlė mūsų kodą, kad įvykdytų 7 arba v1.0.2. Paleiskime savo testą:

$ katės testas.txt

Išvestis:

Štai mano geras kodas 1
Štai mano geras kodas 2
Čia yra mano geras kodas 3
Čia yra mano geras kodas 4
Čia yra mano geras kodas 5
Čia yra mano geras kodas 6
Štai mano geras kodas 7

Nematome blogo kodo. Taigi, leiskite „git bisect“ žinoti:

$ git bisect good

Išvestis:

Padalijimas: po to liko išbandyti 2 pakeitimus (maždaug 1 žingsnis)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Mano įsipareigojimas 9

Tai paskatino mus įsipareigoti 9. Mes dar kartą išbandome:

$ katės testas.txt

Išvestis:

Štai mano geras kodas 1
Štai mano geras kodas 2
Čia yra mano geras kodas 3
Čia yra mano geras kodas 4
Čia yra mano geras kodas 5
Čia yra mano geras kodas 6
Štai mano geras kodas 7
Štai mano geras kodas 8
Štai mano blogasis kodas 1 <-- BUG INTRODUCED HERE

Mes vėl radome įsipareigojimą, įvedusį klaidą. Tai buvo įsipareigojimas „a33e366 Mano įsipareigojimas 9“. Nors pradėjome nuo skirtingo įtarimų diapazono, kelis žingsnius radome tą pačią klaidą.

Iš naujo nustatykime:

$ git dalykite iš naujo

Išvestis:

Ankstesnė HEAD pozicija buvo a33e366 ... Mano įsipareigojimas 9
Perjungtas į filialo „master“

Išvada

Kaip matote iš pavyzdžio, „git bisect“ leidžia mums greičiau nustatyti problemą. Tai puiki priemonė padidinti jūsų produktyvumą. Užuot praėję visą įsipareigojimų istoriją, galite sistemingiau ieškoti klaidų.

Tolesnis tyrimas:

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

5 geriausios žaidimų fiksavimo kortos
Visi mes matėme ir pamėgome srautinius žaidimus „YouTube“. „PewDiePie“, „Jakesepticye“ ir „Markiplier“ yra tik vieni iš geriausių žaidėjų, kurie uždir...
Kaip sukurti žaidimą „Linux“
Prieš dešimtmetį nedaugelis „Linux“ vartotojų numatė, kad jų mėgstama operacinė sistema vieną dieną bus populiari komercinių vaizdo žaidimų žaidimų pl...
Atvirojo kodo komercinių žaidimų variklių uostai
Nemokami atvirojo kodo ir įvairių platformų žaidimų varikliai gali būti naudojami žaidžiant senus ir kai kuriuos gana naujus žaidimų pavadinimus. Šiam...