Git

Git Bisect vejledning

Git Bisect vejledning
At kommentere dine forpligtelser er en væsentlig del af vedligeholdelsen af ​​sporbar kode. Det hjælper dig med at spore problemer. At finde en fejl baseret på kommentarer alene er imidlertid en kedelig opgave. Det kan tage lang tid at sortere hele historien og finde ud af, hvilken forpligtelse der er synderen.

Kommandoen git bisect giver en måde at fremskynde bugdetekteringsprocessen. Det giver dig mulighed for at finde frem til problemet hurtigere. Med git bisect kan du definere en række forpligtelser, som du formoder, har den problematiske kode og derefter bruge binære eliminationsmetoder til at finde starten på problemet. At finde bugs bliver hurtigere og lettere.

Lad os oprette et eksempel og køre et par testsager for at se, hvordan det fungerer.

Eksempel på opsætning

I vores eksempel opretter vi en test.txt-fil og tilføj en ny linje til filen med hver forpligtelse. Efter 16 forpligtelser vil filens endelige tilstand se sådan ud:

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 ovenstående eksempel kom bug'en ind i koden efter 8 forpligtelser. Vi fortsatte med at udvikle koden selv efter introduktion af fejlen.

Du kan oprette en mappe kaldet my_bisect_test og bruge følgende kommandoer inde i mappen til at oprette eksempelsituationen:

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

Kontrol af historik

Hvis du ser på forpligtelsenes historie, ser du følgende:

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

Selv med kun en håndfuld forpligtelser kan du se, at det er svært at finde frem til den forpligtelse, der startede fejlen.


At finde fejlen

Lad os bruge git log-online for at se en mere renset version af forpligtelseshistorikken.

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

Vi vil finde den situation, hvor linjen “Her er min dårlige kode 1 <- BUG INTRODUCED HERE” entered the picture.

Situation 1

Antag, at vi husker, at vores kode var god indtil v1.0.2, og vi ønsker at kontrollere fra det øjeblik, indtil den seneste forpligtelse. Vi starter først kommandoen bisect:

$ git bisect start

Vi leverer den gode grænse og den dårlige grænse (ingen hash betyder den nyeste kode):

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

Produktion:

Halvskæring: 4 ændringer tilbage til test efter dette (ca. 2 trin)
[3cb475a4693b704793946a878007b40a1ff67cd1] Min commit 12 (v1.0.3)

Bisect-kommandoen har fundet det midterste punkt i vores definerede område og automatisk flyttet koden til at begå 12. Vi kan teste vores kode nu. I vores tilfælde skal vi output indholdet af testen.txt:

$ kat test.txt

Produktion:

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 testens tilstand.txt er i tilstanden post-bug. Så det er i dårlig tilstand. Så vi lader bisect-kommandoen vide:

$ git bisect dårlig

Produktion:

Halvering: 2 revisioner tilbage til test efter dette (ca. 1 trin)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Min forpligtelse 9

Det flytter vores kode til at begå 9. Vi tester igen:

$ kat test.txt

Produktion:

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 fundet startpunktet for fejlen. Forpligtelsen “a33e366 My commit 9” er synderen.

Endelig sætter vi alt tilbage til det normale ved at:

$ git bisect reset

Produktion:

Tidligere HEAD-position var a33e366 ... Min forpligtelse 9
Skiftet til gren 'master'

Situation 2

I det samme eksempel, lad os prøve en situation, hvor en anden udvikler starter med den forudsætning, at fejlen blev introduceret mellem v1.0.0 og v1.0.3. Vi kan starte processen igen:

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

Produktion:

Halvering: 4 revisioner tilbage til test efter dette (ca. 2 trin)
[8995d427668768af88266f1e78213506586b0157] Min commit 7 (v1.0.2)

Bisect har flyttet vores kode til at begå 7 eller v1.0.2. Lad os køre vores test:

$ kat test.txt

Produktion:

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 ikke nogen dårlig kode. Så lad git bisect vide:

$ git halveret godt

Produktion:

Halvering: 2 revisioner tilbage til test efter dette (ca. 1 trin)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Min forpligtelse 9

Det har fået os til at begå 9. Vi tester igen:

$ kat test.txt

Produktion:

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 igen fundet den forpligtelse, der introducerede fejlen. Det var begåelsen “a33e366 Min begå 9”. Selvom vi startede med det forskellige mistankeområde, fandt vi den samme fejl i nogle få trin.

Lad os nulstille:

$ git bisect nulstilling

Produktion:

Tidligere HEAD-position var a33e366 ... Min forpligtelse 9
Skiftet til gren 'master'

Konklusion

Som du kan se fra eksemplet, giver git bisect os mulighed for at finde et problem hurtigere. Det er et fantastisk værktøj til at forbedre din produktivitet. I stedet for at gå igennem hele historien om forpligtelser kan du tage en mere systematisk tilgang til fejlfinding.

Yderligere studier:

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

SuperTuxKart til Linux
SuperTuxKart er en fantastisk titel designet til at give dig Mario Kart-oplevelsen gratis på dit Linux-system. Det er ret udfordrende og sjovt at spil...
Kæmp om Wesnoth-vejledning
Slaget om Wesnoth er et af de mest populære open source-strategispil, som du kan spille på dette tidspunkt. Ikke kun har dette spil været under udvikl...
0 A.D. Vejledning
Ud af de mange strategispil derude, 0 A.D. formår at skille sig ud som en omfattende titel og et meget dybt, taktisk spil på trods af at det er open s...