Git

Git Bisect Tutorial

Git Bisect Tutorial
Å kommentere dine forpliktelser er en viktig del av å opprettholde sporbar kode. Det hjelper deg med å spore problemer. Det er imidlertid en kjedelig oppgave å finne en feil basert på kommentarer alene. Det kan ta lang tid å sortere gjennom all historien og finne ut hvilken forpliktelse som er synderen.

Kommandoen git bisect gir en måte å øke hastigheten på feiloppdagelsesprosessen. Det lar deg finne problemet raskere. Med git bisect kan du definere en rekke forpliktelser som du mistenker har den problematiske koden og deretter bruke binære eliminasjonsmetoder for å finne starten på problemet. Å finne feil blir raskere og enklere.

La oss sette opp et eksempel og kjøre noen få testtilfeller for å se hvordan det fungerer.

Eksempel på oppsett

I vårt eksempel vil vi lage en test.txt-fil og legg til en ny linje i filen med hver kommisjon. Etter 16 forpliktelser vil den endelige tilstanden til filen se slik ut:

Her er min gode kode 1
Her er min gode kode 2
Her er min gode kode 3
Her er min gode kode 4
Her er min gode kode 5
Her er min gode kode 6
Her er min gode kode 7
Her er min gode kode 8
Her er min dårlige kode 1 <-- BUG INTRODUCED HERE
Her er min dårlige kode 2
Her er min dårlige kode 3
Her er min dårlige kode 4
Her er min dårlige kode 5
Her er min dårlige kode 6
Her er min dårlige kode 7
Her er min dårlige kode 8
Her er min dårlige kode 9

I eksemplet ovenfor kom feilen inn i koden etter 8 forpliktelser. Vi fortsatte å utvikle koden selv etter at vi introduserte feilen.

Du kan opprette en mappe som heter my_bisect_test og bruke følgende kommandoer fra inne i mappen for å lage eksempelsituasjonen:

git init
ekko "Her er min gode kode 1"> test.tekst
git add -A && git commit -m "My commit 1"
ekko "Her er min gode kode 2" >> test.tekst
git add -A && git commit -m "My commit 2 (v1.0.0) "
ekko "Her er min gode kode 3" >> test.tekst
git add -A && git commit -m "My commit 3"
ekko "Her er min gode kode 4" >> test.tekst
git add -A && git commit -m "My commit 4"
ekko "Her er min gode kode 5" >> test.tekst
git add -A && git commit -m "My commit 5 (v1.0.1)"
ekko "Her er min gode kode 6" >> test.tekst
git add -A && git commit -m "My commit 6"
ekko "Her er min gode kode 7" >> test.tekst
git add -A && git commit -m "My commit 7 (v1.0.2) "
ekko "Her er min gode kode 8" >> test.tekst
git add -A && git commit -m "My commit 8"
ekko "Her er min dårlige kode 1"> test.tekst
git add -A && git commit -m "My commit 9"
ekko "Her er min dårlige kode 2" >> test.tekst
git add -A && git commit -m "My commit 10"
ekko "Her er min dårlige kode 3" >> test.tekst
git add -A && git commit -m "My commit 11"
ekko "Her er min dårlige kode 4" >> test.tekst
git add -A && git commit -m "My commit 12 (v1.0.3) "
ekko "Her er min dårlige kode 5" >> test.tekst
git add -A && git commit -m "My commit 13"
ekko "Her er min dårlige kode 6" >> test.tekst
git add -A && git commit -m "My commit 14"
ekko "Her er min dårlige kode 7" >> test.tekst
git add -A && git commit -m "My commit 15 (v1.0.4) "
ekko "Her er min dårlige kode 8" >> test.tekst
git add -A && git commit -m "My commit 16"

Sjekker historie

Hvis du ser på forpliktelseshistorikken, ser du følgende:

$ git-logg
begå 3023b63eb42c7fadc93c2dd18b532a44a0a6888a
Forfatter: Zak H
Dato: Søn 31. des 23:07:27 2017 -0800
Mitt forpliktelse 17
begå 10ef0286d6459cd5dea5038a54edf36fc9bfe4c3
Forfatter: Zak H
Dato: Søn 31. desember 23:07:25 2017 -0800
Mitt forpliktelse 16
begå 598d4c4acaeb14cda0552b6a92aa975c436d337a
Forfatter: Zak H
Dato: søndag 31. des 23:07:23 2017 -0800
Mitt forpliktelse 15 (v1.0.4)
begå b9678b75ac93d532eed22ec2c6617e5a9d70fe7b
Forfatter: Zak H
Dato: Søndag 31. desember 23:07:21 2017 -0800
Mitt forpliktelse 14
begå eb3f2f7b0ebedb732ecb5f18bee786cd3cbbb521
Forfatter: Zak H
Dato: Søndag 31. desember 23:07:19 2017 -0800
Mitt forpliktelse 13
begå 3cb475a4693b704793946a878007b40a1ff67cd1
Forfatter: Zak H
Dato: Søndag 31. desember 23:07:17 2017 -0800
Mitt forpliktelse 12 (v1.0.3)
begå 0419a38d898e28c4db69064478ecab7736700310
Forfatter: Zak H
Dato: Søndag 31. desember 23:07:15 2017 -0800
Mitt forpliktelse 11
begå 15bc59201ac1f16aeaa233eb485e81fad48fe35f
Forfatter: Zak H
Dato: Søndag 31. desember 23:07:13 2017 -0800
Min forpliktelse 10
begå a33e366ad9f6004a61a468b48b36e0c0c802a815
Forfatter: Zak H
Dato: Søndag 31. des 23:07:11 2017 -0800
Min forpliktelse 9
begå ead472d61f516067983d7e29d548fc856d6e6868
Forfatter: Zak H
Dato: Søndag 31. des 23:07:09 2017 -0800
Mitt forpliktelse 8
begå 8995d427668768af88266f1e78213506586b0157
Forfatter: Zak H
Dato: Søndag 31. desember 23:07:07 2017 -0800
My commit 7 (v1.0.2)
begå be3b341559752e733c6392a16d6e87b5af52e701
Forfatter: Zak H
Dato: Søn 31. des 23:07:05 2017 -0800
Mitt forpliktelse 6
begå c54b58ba8f73fb464222f30c90aa72f60b99bda9
Forfatter: Zak H
Dato: Søn 31. des 23:07:03 2017 -0800
My commit 5 (v1.0.1)
begå 264267111643ef5014e92e23fd2f306a10e93a64
Forfatter: Zak H
Dato: Søn 31. des 23:07:01 2017 -0800
Mitt forpliktelse 4
begå cfd7127cd35f3c1a55eb7c6608ecab75be30b208
Forfatter: Zak H
Dato: Søn 31. desember 23:06:59 2017 -0800
Mitt forpliktelse 3
begå 3f90793b631ddce7be509c36b0244606a2c0e8ad
Forfatter: Zak H
Dato: Søn 31. des 23:06:57 2017 -0800
My commit 2 (v1.0.0)
begå cc163adb8a3f7b7b52411db2b3d8bab9b7fb191e
Forfatter: Zak H
Dato: Søn 31. des 23:06:55 2017 -0800
Mitt forpliktelse 1

Selv med bare en håndfull forpliktelser, kan du se at det er vanskelig å finne frem til forpliktelsen som startet feilen.


Å finne feilen

La oss bruke git log -online for å se en mer ryddet versjon av forpliktelseshistorikken.

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

Vi ønsker å finne situasjonen der linjen “Her er min dårlige kode 1 <- BUG INTRODUCED HERE” entered the picture.

Situasjon 1

Anta at vi husker at koden vår var god til v1.0.2, og vi vil sjekke fra det øyeblikket til siste forpliktelse. Vi starter først bisect-kommandoen:

$ git bisect start

Vi gir den gode grensen og den dårlige grensen (ingen hash betyr den siste koden):

$ git bisect god 8995d42
$ git bisect dårlig

Produksjon:

Halvering: 4 revisjoner igjen for å teste etter dette (omtrent to trinn)
[3cb475a4693b704793946a878007b40a1ff67cd1] My commit 12 (v1.0.3)

Bisect-kommandoen har funnet midtpunktet i vårt definerte område og automatisk flyttet koden til å begå 12. Vi kan teste koden vår nå. I vårt tilfelle skal vi levere innholdet i testen.tekst:

$ kattest.tekst

Produksjon:

Her er min gode kode 1
Her er min gode kode 2
Her er min gode kode 3
Her er min gode kode 4
Her er min gode kode 5
Her er min gode kode 6
Her er min gode kode 7
Her er min gode kode 8
Her er min dårlige kode 1 <-- BUG INTRODUCED HERE
Her er min dårlige kode 2
Her er min dårlige kode 3
Her er min dårlige kode 4

Vi ser at tilstanden til testen.txt er i post-bug-tilstand. Så det er i dårlig tilstand. Så vi la bisect-kommandoen vite:

$ git bisect dårlig

Produksjon:

Halvering: 2 revisjoner igjen for å teste etter dette (omtrent 1 trinn)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] My commit 9

Den flytter koden vår for å begå 9. Vi tester igjen:

$ kattest.tekst

Produksjon:

Her er min gode kode 1
Her er min gode kode 2
Her er min gode kode 3
Her er min gode kode 4
Her er min gode kode 5
Her er min gode kode 6
Her er min gode kode 7
Her er min gode kode 8
Her er min dårlige kode 1 <-- BUG INTRODUCED HERE

Vi ser at vi har funnet utgangspunktet for feilen. Forpliktelsen “a33e366 My commit 9” er synderen.

Til slutt setter vi alt tilbake til det normale ved å:

$ git bisect reset

Produksjon:

Tidligere HEAD-stilling var a33e366 ... Mitt tilsagn 9
Byttet til gren 'master'

Situasjon 2

I det samme eksemplet, la oss prøve en situasjon der en annen utvikler starter med forutsetningen om at feilen ble introdusert mellom v1.0.0 og v1.0.3. Vi kan starte prosessen på nytt:

$ git bisect start
$ git bisect bra 3f90793
$ git bisect dårlig 3cb475a

Produksjon:

Halvering: 4 revisjoner igjen for å teste etter dette (omtrent 2 trinn)
[8995d427668768af88266f1e78213506586b0157] My commit 7 (v1.0.2)

Bisect har flyttet koden vår til å begå 7 eller v1.0.2. La oss kjøre testen vår:

$ kattest.tekst

Produksjon:

Her er min gode kode 1
Her er min gode kode 2
Her er min gode kode 3
Her er min gode kode 4
Her er min gode kode 5
Her er min gode kode 6
Her er min gode kode 7

Vi ser ingen dårlig kode. Så gi git bisect beskjed:

$ git bisect bra

Produksjon:

Halvering: 2 revisjoner igjen for å teste etter dette (omtrent 1 trinn)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] My commit 9

Det har fått oss til å begå 9. Vi tester igjen:

$ kattest.tekst

Produksjon:

Her er min gode kode 1
Her er min gode kode 2
Her er min gode kode 3
Her er min gode kode 4
Her er min gode kode 5
Her er min gode kode 6
Her er min gode kode 7
Her er min gode kode 8
Her er min dårlige kode 1 <-- BUG INTRODUCED HERE

Vi har igjen funnet forpliktelsen som introduserte feilen. Det var forpliktelsen “a33e366 Mitt forpliktelse 9”. Selv om vi startet med forskjellige mistanker, fant vi den samme feilen i noen få trinn.

La oss tilbakestille:

$ git bisect reset

Produksjon:

Tidligere HEAD-stilling var a33e366 ... Mitt tilsagn 9
Byttet til gren 'master'

Konklusjon

Som du kan se fra eksemplet, lar git bisect oss finne et problem raskere. Det er et flott verktøy for å forbedre produktiviteten din. I stedet for å gå gjennom hele historien om forpliktelser, kan du ta en mer systematisk tilnærming til feilsøking.

Videre studier:

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

SuperTuxKart for Linux
SuperTuxKart er en flott tittel designet for å gi deg Mario Kart-opplevelsen gratis på Linux-systemet ditt. Det er ganske utfordrende og morsomt å spi...
Kjemp om Wesnoth-opplæringen
Kampen om Wesnoth er et av de mest populære open source-strategispillene du kan spille på dette tidspunktet. Ikke bare har dette spillet vært i utvikl...
0 A.D. Opplæringen
Ut av de mange strategispillene der ute, 0 A.D. klarer å skille seg ut som en omfattende tittel og et veldig dypt, taktisk spill til tross for å være ...