Git bisect tutorial

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

Git Bisect -kommandoen gir en måte å fremskynde feildeteksjonsprosessen. Det lar deg finne problemet raskere. Med Git Bisect kan du definere en rekke forpliktelser som du mistenker at du har den problematiske koden og deretter bruker 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å testsaker for å se hvordan det fungerer.

Eksempeloppsett

I vårt eksempel vil vi lage en test.txt -fil og legg til en ny linje i filen med hver forpliktelse. 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 å ha introdusert feilen.

Du kan opprette en mappe som heter my_bisect_test og bruke følgende kommandoer fra innsiden av mappen for å opprette eksempelet:

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

Kontrollere historien

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

$ git log
Forpliktelse 3023B63EB42C7FADC93C2DD18B532A44A0A6888A
Forfatter: Zak H
Dato: Sol 31. desember 23:07:27 2017 -0800
Min forpliktelse 17
forpliktelse 10EF0286D6459CD5DEA5038A54EDF36FC9BFE4C3
Forfatter: Zak H
Dato: Sol 31. desember 23:07:25 2017 -0800
Min forpliktelse 16
Forpliktelse 598D4C4ACAEB14CDA0552B6A92AA975C436D337A
Forfatter: Zak H
Dato: Sol 31. desember 23:07:23 2017 -0800
Min forpliktelse 15 (v1.0.4)
forpliktelse B9678B75AC93D532EED22EC2C6617E5A9D70FE7B
Forfatter: Zak H
Dato: Sol 31. desember 23:07:21 2017 -0800
Min forpliktelse 14
forplikte EB3F2F7B0EBEDB732ECB5F18BEE786CD3CBBB521
Forfatter: Zak H
Dato: Sol 31. desember 23:07:19 2017 -0800
Min forpliktelse 13
forpliktelse 3CB475A4693B704793946A878007B40A1FF67CD1
Forfatter: Zak H
Dato: Sol 31. desember 23:07:17 2017 -0800
Min forpliktelse 12 (v1.0.3)
forpliktelse 0419a38d898e28c4db69064478ecab7736700310
Forfatter: Zak H
Dato: Sol 31. desember 23:07:15 2017 -0800
Min forpliktelse 11
Forpliktelse 15BC59201AC1F16AEAA233EB485E81FAD48FE35F
Forfatter: Zak H
Dato: Sol 31. desember 23:07:13 2017 -0800
Min forpliktelse 10
forplikte A33E366AD9F6004A61A468B48B36E0C0C802A815
Forfatter: Zak H
Dato: Sol 31. desember 23:07:11 2017 -0800
Min forpliktelse 9
forplikte EAD472D61F516067983D7E29D548FC856D6E6868
Forfatter: Zak H
Dato: Sol 31. desember 23:07:09 2017 -0800
Min forpliktelse 8
forpliktelse 8995d427668768af88266f1e78213506586b0157
Forfatter: Zak H
Dato: Sol 31. desember 23:07:07 2017 -0800
Min forpliktelse 7 (v1.0.2)
Forpliktelse BE3B341559752E733C6392A16D6E87B5AF52E701
Forfatter: Zak H
Dato: Sol 31. desember 23:07:05 2017 -0800
Min forpliktelse 6
Forpliktelse C54B58BA8F73FB464222F30C90AA72F60B99BDA9
Forfatter: Zak H
Dato: Sol 31. desember 23:07:03 2017 -0800
Min forpliktelse 5 (v1.0.1)
forpliktelse 264267111643EF5014E92E23FD2F306A10E93A64
Forfatter: Zak H
Dato: Sol 31. desember 23:07:01 2017 -0800
Min forpliktelse 4
forplikte CFD7127CD35F3C1A55EB7C6608ECAB75BE30B208
Forfatter: Zak H
Dato: Sol 31. desember 23:06:59 2017 -0800
Min forpliktelse 3
forpliktelse 3F90793B631DDCE7BE509C36B0244606A2C0E8AD
Forfatter: Zak H
Dato: Sol 31. desember 23:06:57 2017 -0800
Min forpliktelse 2 (v1.0.0)
Forpliktelse CC163ADB8A3F7B7B52411DB2B3D8BAB9B7FB191E
Forfatter: Zak H
Dato: Sol 31. desember 23:06:55 2017 -0800
Min forpliktelse 1

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


Finne feilen

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

$ git log --oneline
3023b63 min forpliktelse 17
10EF028 min forpliktelse 16
598d4c4 min forpliktelse 15 (v1.0.4)
B9678B7 Min forpliktelse 14
eb3f2f7 min forpliktelse 13
3CB475a min forpliktelse 12 (v1.0.3)
0419a38 min forpliktelse 11
15BC592 Min forpliktelse 10
a33e366 min forpliktelse 9
ead472d min forpliktelse 8
8995d42 min forpliktelse 7 (v1.0.2)
be3b341 min forpliktelse 6
C54B58B min forpliktelse 5 (V1.0.1)
2642671 min forpliktelse 4
CFD7127 Min forpliktelse 3
3F90793 Min forpliktelse 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 den siste forpliktelsen. Vi starter først Bisect -kommandoen:

$ git bisect start

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

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

Produksjon:

Bisecting: 4 revisjoner som er igjen for å teste etter dette (omtrent 2 trinn)
[3CB475A4693B704793946A878007B40A1FF67CD1] Min forpliktelse 12 (V1.0.3)

Bisect -kommandoen har funnet midtpunktet i vårt definerte område og flyttet koden automatisk for å forplikte seg 12. Vi kan teste koden vår nå. I vårt tilfelle skal vi sende inn innholdet i test.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 teststaten.TXT er i staten etter bug. Så det er i dårlig tilstand. Så vi lar BISECT -kommandoen vite:

$ git bisect dårlig

Produksjon:

Bisecting: 2 revisjoner som er igjen for å teste etter dette (omtrent 1 trinn)
[A33E366AD9F6004A61A468B48B36E0C0C802A815] Min forpliktelse 9

Det flytter koden vår for å forplikte 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 den skyldige.

Til slutt setter vi alt tilbake til det normale av:

$ git bisect reset

Produksjon:

Forrige hodeposisjon var A33E366 ... min forpliktelse 9
Byttet til filial 'master'

Situasjon 2

La oss i samme eksempel 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 igjen:

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

Produksjon:

Bisecting: 4 revisjoner som er igjen for å teste etter dette (omtrent 2 trinn)
[8995D427668768AF88266F1E78213506586B0157] My Commit 7 (V1.0.2)

Bisect har flyttet koden vår for å forplikte 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 beskjed til å få vite:

$ git bisect bra

Produksjon:

Bisecting: 2 revisjoner som er igjen for å teste etter dette (omtrent 1 trinn)
[A33E366AD9F6004A61A468B48B36E0C0C802A815] Min forpliktelse 9

Det har fått oss til å forplikte oss 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 My Commit 9”. Selv om vi startet med det forskjellige mistankeområdet, fant vi den samme feilen i noen få trinn.

La oss tilbakestille:

$ git bisect reset

Produksjon:

Forrige hodeposisjon var A33E366 ... min forpliktelse 9
Byttet til filial 'master'

Konklusjon

Som du ser av 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-cm.com/docs/git-bisect
https: // git-cm.com/bok/en/v2/git-tools-debugging-with-git