Git

Git Bisect apmācība

Git Bisect apmācība
Jūsu apņemšanās komentēšana ir būtiska izsekojamā koda uzturēšanas sastāvdaļa. Tas palīdz izsekot problēmas. Tomēr kļūdas atrašana, pamatojoties tikai uz komentāriem, ir garlaicīgs uzdevums. Var paiet ilgs laiks, lai kārtotu visu vēsturi un noskaidrotu, kurš apņemšanās ir vaininieks.

Git bisect komanda nodrošina iespēju paātrināt kļūdu noteikšanas procesu. Tas ļauj ātrāk noteikt problēmu. Izmantojot git bisect, jūs varat definēt virkni darbību, par kurām jums ir aizdomas, ka ir problemātiskais kods, un pēc tam izmantot binārās eliminācijas metodes, lai atrastu problēmas sākumu. Kļūdu atrašana kļūst ātrāka un vienkāršāka.

Izveidosim piemēru un palaidīsim dažus testa gadījumus, lai redzētu, kā tas darbojas.

Iestatīšanas piemērs

Mūsu piemērā mēs izveidosim testu.txt failu un pievienojiet failam jaunu rindu ar katru apņemšanos. Pēc 16 saistībām faila galīgais stāvoklis izskatīsies šādi:

Šeit ir mans labs kods 1
Šeit ir mans labs kods 2
Šeit ir mans labs kods 3
Šeit ir mans labais kods 4
Šeit ir mans labais kods 5
Šeit ir mans labs kods 6
Šeit ir mans labs kods 7
Šeit ir mans labais kods 8
Šeit ir mans sliktais kods 1 <-- BUG INTRODUCED HERE
Šeit ir mans sliktais kods 2
Šeit ir mans sliktais kods 3
Šeit ir mans sliktais kods 4
Šeit ir mans sliktais kods 5
Šeit ir mans sliktais kods 6
Šeit ir mans sliktais kods 7
Šeit ir mans sliktais kods 8
Šeit ir mans sliktais kods 9

Iepriekš minētajā piemērā kļūda kodā iekļuva pēc 8 izdarīšanas. Mēs turpinājām izstrādāt kodu pat pēc kļūdas ieviešanas.

Varat izveidot mapi my_bisect_test un izmantot šādas komandas no mapes iekšpuses, lai izveidotu situācijas piemēru:

git init
atbalss "Šeit ir mans labs kods 1"> tests.txt
git add -A && git saistības -m "Mana saistība 1"
atbalss "Šeit ir mans labs kods 2" >> tests.txt
git add -A && git saistības -m "Mana saistība 2 (v1.0.0) "
atbalss "Šeit ir mans labais kods 3" >> tests.txt
git add -A && git saistības -m "Mana saistība 3"
atbalss "Šeit ir mans labais kods 4" >> tests.txt
git add -A && git saistības -m "Mans apņemšanās 4"
atbalss "Šeit ir mans labais kods 5" >> tests.txt
git add -A && git saistības -m "Mans apņemšanās 5 (v1.0.1) "
atbalss "Šeit ir mans labais kods 6" >> tests.txt
git add -A && git saistības -m "Mans apņemšanās 6"
atbalss "Šeit ir mans labs kods 7" >> tests.txt
git add -A && git saistīt -m "Mana saistība 7 (v1.0.2) "
atbalss "Šeit ir mans labais kods 8" >> tests.txt
git add -A && git saistības -m "Mans apņemšanās 8"
atbalss "Šeit ir mans sliktais kods 1"> tests.txt
git add -A && git saistības -m "Mans apņemšanās 9"
atbalss "Šeit ir mans sliktais kods 2" >> tests.txt
git add -A && git saistības -m "Mana saistība 10"
atbalss "Šeit ir mans sliktais kods 3" >> tests.txt
git add -A && git saistības -m "Mana saistība 11"
atbalss "Šeit ir mans sliktais kods 4" >> tests.txt
git add -A && git saistīt -m "Mana saistība 12 (v1.0.3) "
atbalss "Šeit ir mans sliktais kods 5" >> tests.txt
git add -A && git saistības -m "Mana saistība 13"
atbalss "Šeit ir mans sliktais kods 6" >> tests.txt
git add -A && git saistības -m "Mana apņemšanās 14"
atbalss "Šeit ir mans sliktais kods 7" >> tests.txt
git add -A && git saistības -m "Mana apņemšanās 15 (v1.0.4) "
atbalss "Šeit ir mans sliktais kods 8" >> tests.txt
git add -A && git saistības -m "Mana saistība 16"

Vēstures pārbaude

Aplūkojot saistību vēsturi, redzat sekojošo:

$ git žurnāls
izdarīt 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Autors: Zaks H
Datums: Sv 31. decembris 23:07:27 2017 -0800
Mana apņemšanās 17
veikt 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Autors: Zaks H
Datums: Sv 31. decembris 23:07:25 2017 -0800
Mana apņemšanās 16
izdarīt 598d4c4acaeb14cda0552b6a92aa975c436d337a
Autors: Zaks H
Datums: Sv 31. decembris 23:07:23 2017 -0800
Mana apņemšanās 15 (v1.0.4)
izdarīt b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Autors: Zaks H
Datums: svētdecembris 31 23:07:21 2017 -0800
Mana apņemšanās 14
izdarīt eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Autors: Zaks H
Datums: Sv 31. decembris 23:07:19 2017 -0800
Mana apņemšanās 13
izdarīt 3cb475a4693b704793946a878007b40a1ff67cd1
Autors: Zaks H
Datums: Sv 31. decembris 23:07:17 2017 -0800
Mana apņemšanās 12 (v1.0.3)
izdarīt 0419a38d898e28c4db69064478ecab7736700310
Autors: Zaks H
Datums: Sv 31. decembris 23:07:15 2017 -0800
Mana apņemšanās 11
apņemties 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Autors: Zaks H
Datums: Sv 31. decembris 23:07:13 2017 -0800
Mana apņemšanās 10
izdarīt a33e366ad9f6004a61a468b48b36e0c0c802a815
Autors: Zaks H
Datums: Sv 31. decembris 23:07:11 2017 -0800
Mana apņemšanās 9
izdarīt ead472d61f516067983d7e29d548fc856d6e6868
Autors: Zaks H
Datums: Sv 31. decembris 23:07:09 2017 -0800
Mana apņemšanās 8
veikt 8995d427668768af88266f1e78213506586b0157
Autors: Zaks H
Datums: Sv 31. decembris 23:07:07 2017 -0800
Mana apņemšanās 7 (v1.0.2)
izdarīt be3b341559752e733c6392a16d6e87b5af52e701
Autors: Zaks H
Datums: Sv 31. decembris 23:07:05 2017 -0800
Mana apņemšanās 6
veikt c54b58ba8f73fb464222f30c90aa72f60b99bda9
Autors: Zaks H
Datums: Sv 31. decembris 23:07:03 2017 -0800
Mana apņemšanās 5 (v1.0.1)
veikt 264267111643ef5014e92e23fd2f306a10e93a64
Autors: Zaks H
Datums: Sv 31. decembris 23:07:01 2017 -0800
Mana apņemšanās 4
veikt cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Autors: Zaks H
Datums: Sv 31. decembris 23:06:59 2017 -0800
Mana apņemšanās 3
izdarīt 3f90793b631ddce7be509c36b0244606a2c0e8ad
Autors: Zaks H
Datums: Sv 31. decembris 23:06:57 2017 -0800
Mana apņemšanās 2 (v1.0.0)
izdarīt cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Autors: Zaks H
Datums: Sv 31. decembris 23:06:55 2017 -0800
Mana apņemšanās 1

Pat ar nedaudzām saistībām jūs varat redzēt, ka ir grūti precīzi noteikt saistību izpildi, kas izraisīja kļūdu.


Kļūdas atrašana

Izmantosim git log -online, lai redzētu vairāk iztīrītu saistību vēstures versiju.

$ git log - tiešsaistē
3023b63 Mana apņemšanās 17
10ef028 Mana apņemšanās 16
598d4c4 Mana apņemšanās 15 (v1.0.4)
b9678b7 Mana apņemšanās 14
eb3f2f7 Mana apņemšanās 13
3cb475a Mana apņemšanās 12 (v1.0.3)
0419a38 Mana apņemšanās 11
15bc592 Mana apņemšanās 10
a33e366 Mana apņemšanās 9
ead472d Mana apņemšanās 8
8995d42 Mana apņemšanās 7 (v1.0.2)
be3b341 Mana apņemšanās 6
c54b58b Mana apņemšanās 5 (v1.0.1)
2642671 Mana apņemšanās 4
cfd7127 Mana apņemšanās 3
3f90793 Mana apņemšanās 2 (v1.0.0)
cc163ad Mana apņemšanās 1

Mēs vēlamies atrast situāciju, kad rindiņa “Šeit ir mans sliktais kods 1 <- BUG INTRODUCED HERE” entered the picture.

1. situācija

Pieņemsim, ka mēs atceramies, ka mūsu kods bija labs līdz v1.0.2, un mēs vēlamies pārbaudīt no šī brīža līdz pēdējai saistībām. Vispirms mēs sākam komandu bisect:

$ git divpusējs sākums

Mēs nodrošinām labu un sliktu robežu (bez hash nozīmē jaunāko kodu):

$ git divpusēji labs 8995d42
$ git bisect slikti

Izeja:

Dalīšana divās daļās: pēc tam ir jāpārbauda 4 pārskatījumi (aptuveni 2 soļi)
[3cb475a4693b704793946a878007b40a1ff67cd1] Mana saistība 12 (v1.0.3)

Bisect komanda ir atradusi vidējo punktu mūsu definētajā diapazonā un automātiski pārvietoja kodu, lai veiktu 12. Tagad mēs varam pārbaudīt savu kodu. Mūsu gadījumā mēs sagatavosim testa saturu.txt:

$ kaķu tests.txt

Izeja:

Šeit ir mans labs kods 1
Šeit ir mans labs kods 2
Šeit ir mans labs kods 3
Šeit ir mans labais kods 4
Šeit ir mans labais kods 5
Šeit ir mans labs kods 6
Šeit ir mans labs kods 7
Šeit ir mans labais kods 8
Šeit ir mans sliktais kods 1 <-- BUG INTRODUCED HERE
Šeit ir mans sliktais kods 2
Šeit ir mans sliktais kods 3
Šeit ir mans sliktais kods 4

Mēs redzam, ka testa stāvoklis.txt ir pēc kļūdas stāvoklī. Tātad tas ir sliktā stāvoklī. Tāpēc mēs paziņojām komandai bisect:

$ git bisect slikti

Izeja:

Dalīšana divās daļās: pēc tam ir jāpārbauda 2 pārskatījumi (aptuveni 1 solis)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Mana apņemšanās 9

Tas pārvieto mūsu kodu uz 9. Mēs vēlreiz pārbaudām:

$ kaķu tests.txt

Izeja:

Šeit ir mans labs kods 1
Šeit ir mans labs kods 2
Šeit ir mans labs kods 3
Šeit ir mans labais kods 4
Šeit ir mans labs kods 5
Šeit ir mans labs kods 6
Šeit ir mans labs kods 7
Šeit ir mans labais kods 8
Šeit ir mans sliktais kods 1 <-- BUG INTRODUCED HERE

Mēs redzam, ka esam atraduši kļūdas sākumpunktu. Apņemšanās “a33e366 Mana apņemšanās 9” ir vaininieks.

Visbeidzot, mēs visu normalizējām:

$ git bisect reset

Izeja:

Iepriekšējā HEAD pozīcija bija a33e366 ... Mana apņemšanās 9
Pārslēgts uz filiāli “kapteinis”

2. situācija

Šajā pašā piemērā izmēģināsim situāciju, kad cits izstrādātājs sāk ar pieņēmumu, ka kļūda tika ieviesta starp v1.0.0 un v1.0.3. Mēs varam sākt procesu no jauna:

$ git divpusējs sākums
$ git divpusēji labs 3f90793
$ git sadaliet slikti 3cb475a

Izeja:

Dalīšana pa daļām: Pēc tam ir jāpārbauda 4 pārskatījumi (aptuveni 2 soļi)
[8995d427668768af88266f1e78213506586b0157] Mana saistība 7 (v1.0.2)

Bisect ir pārvietojis mūsu kodu uz 7 vai v1.0.2. Izpildīsim mūsu testu:

$ kaķu tests.txt

Izeja:

Šeit ir mans labs kods 1
Šeit ir mans labs kods 2
Šeit ir mans labs kods 3
Šeit ir mans labais kods 4
Šeit ir mans labais kods 5
Šeit ir mans labs kods 6
Šeit ir mans labs kods 7

Mēs neredzam nevienu sliktu kodu. Tātad, ļaujiet git bisect zināt:

$ git divpusēji labs

Izeja:

Dalīšana divās daļās: pēc tam ir jāpārbauda 2 pārskatījumi (aptuveni 1 solis)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Mana apņemšanās 9

Tas mūs ir pamudinājis apņemties izpildīt 9. Mēs vēlreiz pārbaudām:

$ kaķu tests.txt

Izeja:

Šeit ir mans labs kods 1
Šeit ir mans labs kods 2
Šeit ir mans labs kods 3
Šeit ir mans labais kods 4
Šeit ir mans labs kods 5
Šeit ir mans labs kods 6
Šeit ir mans labs kods 7
Šeit ir mans labais kods 8
Šeit ir mans sliktais kods 1 <-- BUG INTRODUCED HERE

Mēs atkal esam atraduši apņemšanos, kas ieviesa kļūdu. Tas bija apņemšanās “a33e366 Mans apņemšanās 9”. Lai gan mēs sākām ar atšķirīgo aizdomu diapazonu, dažos soļos atradām to pašu kļūdu.

Atiestatīsim:

$ git bisect reset

Izeja:

Iepriekšējā HEAD pozīcija bija a33e366 ... Mana apņemšanās 9
Pārslēgts uz filiāli “kapteinis”

Secinājums

Kā redzams no piemēra, git bisect ļauj mums ātrāk noteikt problēmu. Tas ir lielisks līdzeklis, lai uzlabotu jūsu produktivitāti. Tā vietā, lai izietu visu saistību vēsturi, jūs varat sistemātiskāk pieiet atkļūdošanā.

Turpmāka izpēte:

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

OpenTTD vs Simutrans
Transporta simulācijas izveide var būt jautra, relaksējoša un ārkārtīgi vilinoša. Tāpēc jums jāpārliecinās, ka izmēģināt pēc iespējas vairāk spēļu, la...
OpenTTD apmācība
OpenTTD ir viena no populārākajām biznesa simulācijas spēlēm. Šajā spēlē jums ir jāizveido brīnišķīgs transporta bizness. Tomēr jūs sāksit sākumā apmē...
SuperTuxKart operētājsistēmai Linux
SuperTuxKart ir lielisks nosaukums, kas paredzēts, lai sniegtu jums Mario Kart pieredzi bez maksas jūsu Linux sistēmā. Tas ir diezgan izaicinoši un ja...