Git

Git Bisecti õpetus

Git Bisecti õpetus
Oma toimingute kommenteerimine on jälgitava koodi säilitamise oluline osa. See aitab teil probleeme jälgida. Vea leidmine ainuüksi kommentaaride põhjal on aga tüütu ülesanne. Võib kuluda palju aega, et kogu ajalugu läbi sorteerida ja välja selgitada, kumb on süüdlane.

Git bisect käsk annab võimaluse vea tuvastamise protsessi kiirendada. See võimaldab teil probleemi kiiremini kindlaks teha. Git bisecti abil saate määratleda toimingute vahemiku, mille puhul kahtlustate probleemset koodi, ja seejärel probleemi alguse leidmiseks kasutada binaarseid kõrvaldamismeetodeid. Vigade leidmine muutub kiiremaks ja lihtsamaks.

Paneme paika näite ja käivitame paar proovijuhtu, et näha, kuidas see töötab.

Näite seadistamine

Meie näites loome testi.txt-faili ja lisage faili iga rida iga pühendusega. Pärast 16 kohustust näeb faili lõplik olek välja selline:

Siin on minu hea kood 1
Siin on minu hea kood 2
Siin on minu hea kood 3
Siin on minu hea kood 4
Siin on minu hea kood 5
Siin on minu hea kood 6
Siin on minu hea kood 7
Siin on minu hea kood 8
Siin on minu halb kood 1 <-- BUG INTRODUCED HERE
Siin on minu halb kood 2
Siin on minu halb kood 3
Siin on minu halb kood 4
Siin on minu halb kood 5
Siin on minu halb kood 6
Siin on minu halb kood 7
Siin on minu halb kood 8
Siin on minu halb kood 9

Ülalolevas näites sattus viga koodi sisse pärast 8 toimingut. Jätkasime koodi arendamist ka pärast vea tutvustamist.

Saate luua kausta nimega my_bisect_test ja kasutada näitesituatsiooni loomiseks järgmisi käske kausta sees:

git init
kaja "Siin on minu hea kood 1"> test.txt
git add -A && git pühendus -m "Minu pühendumine 1"
kaja "Siin on minu hea kood 2" >> test.txt
git add -A && git toime -m "Minu kohustus 2 (v1.0.0) "
kaja "Siin on minu hea kood 3" >> test.txt
git add -A && git pühendus -m "Minu pühendumine 3"
kaja "Siin on minu hea kood 4" >> test.txt
git add -A && git pühendus -m "Minu pühendumine 4"
kaja "Siin on minu hea kood 5" >> test.txt
git add -A && git toime -m "Minu kohustus 5 (v1.0.1) "
kaja "Siin on minu hea kood 6" >> test.txt
git add -A && git pühendus -m "Minu kohustus 6"
kaja "Siin on minu hea kood 7" >> test.txt
git add -A && git toime -m "Minu pühendumine 7 (v1.0.2) "
kaja "Siin on minu hea kood 8" >> test.txt
git add -A && git pühendama -m "Minu kohustus 8"
kaja "Siin on minu halb kood 1"> test.txt
git add -A && git pühendu -m "Minu pühendumine 9"
kaja "Siin on minu halb kood 2" >> test.txt
git add -A && git pühendu -m "Minu pühendumine 10"
kaja "Siin on minu halb kood 3" >> test.txt
git add -A && git pühendama -m "Minu pühendumine 11"
kaja "Siin on minu halb kood 4" >> test.txt
git add -A && git toime -m "Minu kohustus 12 (v1.0.3) "
kaja "Siin on minu halb kood 5" >> test.txt
git add -A && git pühendama -m "Minu pühendumine 13"
kaja "Siin on minu halb kood 6" >> test.txt
git add -A && git pühendu -m "Minu pühendumine 14"
kaja "Siin on minu halb kood 7" >> test.txt
git add -A && git toime -m "Minu kohustus 15 (v1.0.4) "
kaja "Siin on minu halb kood 8" >> test.txt
git add -A && git pühendus -m "Minu kohustus 16"

Ajaloo kontrollimine

Kui vaatate toimingute ajalugu, näete järgmist:

$ git logi
toime panema 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Autor: Zak H
Kuupäev: 31. detsember 23:07:27 2017 -0800
Minu kohustus 17
pühenduma 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Autor: Zak H
Kuupäev: 31. detsember 23:07:25 2017 -0800
Minu kohustus 16
pühenduma 598d4c4acaeb14cda0552b6a92aa975c436d337a
Autor: Zak H
Kuupäev: 31. detsember 23:07:23 2017 -0800
Minu kohustus 15 (v1.0.4)
panema b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Autor: Zak H
Kuupäev: 31. detsember 23:07:21 2017 -0800
Minu kohustus 14
siduma eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Autor: Zak H
Kuupäev: 31. detsember 23:07:19 2017 -0800
Minu kohustus 13
pühenduma 3cb475a4693b704793946a878007b40a1ff67cd1
Autor: Zak H
Kuupäev: 31. detsember 23:07:17 2017 -0800
Minu kohustus 12 (v1.0.3)
toime panema 0419a38d898e28c4db69064478ecab7736700310
Autor: Zak H
Kuupäev: 31. detsember 23:07:15 2017 -0800
Minu kohustus 11
toime panema 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Autor: Zak H
Kuupäev: 31. detsember 23:07:13 2017 -0800
Minu kohustus 10
toime panema a33e366ad9f6004a61a468b48b36e0c0c802a815
Autor: Zak H
Kuupäev: 31. detsember 23:07:11 2017 -0800
Minu kohustus 9
toime panema ead472d61f516067983d7e29d548fc856d6e6868
Autor: Zak H
Kuupäev: 31. detsember 23:07:09 2017 -0800
Minu kohustus 8
pühenduma 8995d427668768af88266f1e78213506586b0157
Autor: Zak H
Kuupäev: 31. detsember 23:07:07 2017 -0800
Minu kohustus 7 (v1.0.2)
pühenduma be3b341559752e733c6392a16d6e87b5af52e701
Autor: Zak H
Kuupäev: 31. detsember 23:07:05 2017 -0800
Minu kohustus 6
pühenduma c54b58ba8f73fb464222f30c90aa72f60b99bda9
Autor: Zak H
Kuupäev: 31. detsember 23:07:03 2017 -0800
Minu kohustus 5 (v1.0.1)
toime panema 264267111643ef5014e92e23fd2f306a10e93a64
Autor: Zak H
Kuupäev: 31. detsember 23:07:01 2017 -0800
Minu kohustus 4
pühenduma cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Autor: Zak H
Kuupäev: 31. detsember 23:06:59 2017 -0800
Minu kohustus 3
pühenduma 3f90793b631ddce7be509c36b0244606a2c0e8ad
Autor: Zak H
Kuupäev: 31. detsember 23:06:57 2017 -0800
Minu kohustus 2 (v1.0.0)
pühenduma cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Autor: Zak H
Kuupäev: 31. detsember 23:06:55 2017 -0800
Minu kohustus 1

Isegi ainult käputäie kohustuste korral näete, et vea käivitanud kohustuse määramine on keeruline.


Vea leidmine

Kasutame git log -online, et näha pühendamise ajaloo puhtamat versiooni.

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

Tahame leida olukorra, kus rida „Siin on minu halb kood 1 <- BUG INTRODUCED HERE” entered the picture.

Olukord 1

Oletame, et mäletame, et meie kood oli hea kuni v1.0.2 ja me tahame kontrollida sellest hetkest kuni viimase kohustuse täitmiseni. Alustame kõigepealt bisecti käsku:

$ git kahepoolne algus

Pakume hea ja halva piiri (räsi ei tähenda uusimat koodi):

$ git poolitage head 8995d42
$ git poolitage halb

Väljund:

Poolitamine: pärast seda on testimiseks jäänud 4 versiooni (umbes 2 sammu)
[3cb475a4693b704793946a878007b40a1ff67cd1] Minu kohustus 12 (v1.0.3)

Bisect-käsk on leidnud meie määratletud vahemikus keskpunkti ja teisaldanud koodi automaatselt 12 sidumiseks. Saame oma koodi nüüd testida. Meie puhul väljastame testi sisu.txt:

$ kassi test.txt

Väljund:

Siin on minu hea kood 1
Siin on minu hea kood 2
Siin on minu hea kood 3
Siin on minu hea kood 4
Siin on minu hea kood 5
Siin on minu hea kood 6
Siin on minu hea kood 7
Siin on minu hea kood 8
Siin on minu halb kood 1 <-- BUG INTRODUCED HERE
Siin on minu halb kood 2
Siin on minu halb kood 3
Siin on minu halb kood 4

Näeme, et testimise seis.txt on veajärgses olekus. Nii et see on halvas seisus. Nii et andsime bisect käsule teada:

$ git poolitage halb

Väljund:

Poolitamine: pärast seda on testimiseks jäänud 2 redaktsiooni (umbes 1 samm)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Minu kohustus 9

See liigutab meie koodi 9 täitmiseks. Testime uuesti:

$ kassi test.txt

Väljund:

Siin on minu hea kood 1
Siin on minu hea kood 2
Siin on minu hea kood 3
Siin on minu hea kood 4
Siin on minu hea kood 5
Siin on minu hea kood 6
Siin on minu hea kood 7
Siin on minu hea kood 8
Siin on minu halb kood 1 <-- BUG INTRODUCED HERE

Näeme, et oleme leidnud vea alguspunkti. Süüdlane on „a33e366 Minu pühendumine 9”.

Lõpuks paneme kõik normaalseks:

$ git kahesuunaline lähtestamine

Väljund:

Eelmine HEADi ametikoht oli a33e366 ... Minu kohustus 9
Üleminek harule 'master'

Olukord 2

Proovime samas näites olukorda, kus teine ​​arendaja lähtub eeldusest, et viga võeti kasutusele v1 vahel.0.0 ja v1.0.3. Saame protsessi uuesti alustada:

$ git kahepoolne algus
$ git poolitage head 3f90793
$ git poolitage halb 3cb475a

Väljund:

Poolitamine: pärast seda on testimiseks jäänud 4 versiooni (umbes 2 sammu)
[8995d427668768af88266f1e78213506586b0157] Minu kohustus 7 (v1.0.2)

Bisect on meie koodi viinud 7 või v1 sidumiseks.0.2. Käivitame oma testi:

$ kassi test.txt

Väljund:

Siin on minu hea kood 1
Siin on minu hea kood 2
Siin on minu hea kood 3
Siin on minu hea kood 4
Siin on minu hea kood 5
Siin on minu hea kood 6
Siin on minu hea kood 7

Me ei näe ühtegi halba koodi. Nii et andke git poolitada:

$ git poolitada hea

Väljund:

Poolitamine: pärast seda on testimiseks jäänud 2 redaktsiooni (umbes 1 samm)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Minu kohustus 9

See on pannud meid 9 pühenduma. Testime uuesti:

$ kassi test.txt

Väljund:

Siin on minu hea kood 1
Siin on minu hea kood 2
Siin on minu hea kood 3
Siin on minu hea kood 4
Siin on minu hea kood 5
Siin on minu hea kood 6
Siin on minu hea kood 7
Siin on minu hea kood 8
Siin on minu halb kood 1 <-- BUG INTRODUCED HERE

Oleme taas leidnud kohustuse, mis tõi vea sisse. See oli kohustus "a33e366 Minu kohustus 9". Kuigi alustasime erineva kahtlustusvahemikuga, leidsime mõne sammu jooksul sama vea.

Lähtestame:

$ git kahesuunaline lähtestamine

Väljund:

Eelmine HEADi ametikoht oli a33e366 ... Minu kohustus 9
Üleminek harule 'master'

Järeldus

Nagu näite põhjal näha, võimaldab git bisect meil probleemi kiiremini tuvastada. See on suurepärane vahend oma tootlikkuse suurendamiseks. Kogu kohustuste ajaloo läbimise asemel võite silumisele läheneda süsteemsemalt.

Edasine uuring:

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

OpenTTD vs Simutrans
Oma transpordisimulatsiooni loomine võib olla lõbus, lõõgastav ja äärmiselt köitev. Sellepärast peate endale meelepärase leidmiseks kindlasti proovima...
OpenTTD õpetus
OpenTTD on seal üks populaarsemaid ärisimulatsioonimänge. Selles mängus peate looma suurepärase transpordiettevõtte. Alustate siiski alguses umbes 190...
SuperTuxKart Linuxile
SuperTuxKart on suurepärane pealkiri, mis on loodud selleks, et tuua teie Linuxi süsteemis tasuta Mario Karti kogemus. See on päris keeruline ja lõbus...