Git

Git Bisect Tutorial

Git Bisect Tutorial
Kommentera dina åtaganden är en viktig del av att upprätthålla spårbar kod. Det hjälper dig att spåra problem. Att hitta en bugg baserad på kommentarer ensam är dock en tråkig uppgift. Det kan ta lång tid att sortera igenom hela historien och ta reda på vilket åtagande som är den skyldige.

Kommandot git bisect ger ett sätt att påskynda feldetekteringsprocessen. Det låter dig hitta problemet snabbare. Med git bisect kan du definiera ett antal åtaganden som du misstänker har den problematiska koden och sedan använda binära eliminationsmetoder för att hitta början på problemet. Att hitta buggar blir snabbare och enklare.

Låt oss skapa ett exempel och köra några testfall för att se hur det fungerar.

Exempel på installation

I vårt exempel skapar vi ett test.txt-fil och lägg till en ny rad i filen med varje engagemang. Efter 16 åtaganden kommer filens slutliga tillstånd att se ut så här:

Här är min bra kod 1
Här är min bra kod 2
Här är min bra kod 3
Här är min bra kod 4
Här är min bra kod 5
Här är min bra kod 6
Här är min bra kod 7
Här är min bra kod 8
Här är min dåliga kod 1 <-- BUG INTRODUCED HERE
Här är min dåliga kod 2
Här är min dåliga kod 3
Här är min dåliga kod 4
Här är min dåliga kod 5
Här är min dåliga kod 6
Här är min dåliga kod 7
Här är min dåliga kod 8
Här är min dåliga kod 9

I exemplet ovan kom buggen in i koden efter 8 åtaganden. Vi fortsatte att utveckla koden även efter att vi introducerade felet.

Du kan skapa en mapp som heter my_bisect_test och använda följande kommandon inifrån mappen för att skapa en exempelsituation:

git init
echo "Här är min bra kod 1"> test.Text
git add -A && git commit -m "My commit 1"
echo "Här är min bra kod 2" >> test.Text
git add -A && git commit -m "My commit 2 (v1.0.0) "
echo "Här är min bra kod 3" >> test.Text
git add -A && git commit -m "My commit 3"
echo "Här är min bra kod 4" >> test.Text
git add -A && git commit -m "My commit 4"
echo "Här är min bra kod 5" >> test.Text
git add -A && git commit -m "My commit 5 (v1.0.1) "
echo "Här är min bra kod 6" >> test.Text
git add -A && git commit -m "My commit 6"
echo "Här är min bra kod 7" >> test.Text
git add -A && git commit -m "My commit 7 (v1.0.2) "
echo "Här är min bra kod 8" >> test.Text
git add -A && git commit -m "My commit 8"
echo "Här är min dåliga kod 1"> test.Text
git add -A && git commit -m "My commit 9"
echo "Här är min dåliga kod 2" >> test.Text
git add -A && git commit -m "My commit 10"
echo "Här är min dåliga kod 3" >> test.Text
git add -A && git commit -m "My commit 11"
echo "Här är min dåliga kod 4" >> test.Text
git add -A && git commit -m "My commit 12 (v1.0.3) "
echo "Här är min dåliga kod 5" >> test.Text
git add -A && git commit -m "My commit 13"
echo "Här är min dåliga kod 6" >> test.Text
git add -A && git commit -m "My commit 14"
echo "Här är min dåliga kod 7" >> test.Text
git add -A && git commit -m "My commit 15 (v1.0.4) "
echo "Här är min dåliga kod 8" >> test.Text
git add -A && git commit -m "My commit 16"

Kontrollerar historik

Om du tittar på åtagandets historik ser du följande:

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

Även med bara en handfull åtaganden kan du se att det är svårt att hitta det engagemang som startade felet.


Hitta Bug

Låt oss använda git log-online för att se en mer rensad version av åtagandeshistoriken.

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

Vi vill hitta situationen där raden ”Här är min dåliga kod 1 <- BUG INTRODUCED HERE” entered the picture.

Situation 1

Antag att vi kommer ihåg att vår kod var bra fram till v1.0.2 och vi vill kontrollera från det ögonblicket tills det senaste åtagandet. Vi startar först kommandot bisect:

$ git bisect start

Vi tillhandahåller den goda gränsen och den dåliga gränsen (ingen hash betyder den senaste koden):

$ git bisect bra 8995d42
$ git bisect dåligt

Produktion:

Halvskärning: 4 ändringar kvar att testa efter detta (ungefär två steg)
[3cb475a4693b704793946a878007b40a1ff67cd1] Mitt engagemang 12 (v1.0.3)

Bisect-kommandot har hittat mittpunkten i vårt definierade intervall och flyttat koden automatiskt till att begå 12. Vi kan testa vår kod nu. I vårt fall kommer vi att leverera innehållet i testet.Text:

$ cat test.Text

Produktion:

Här är min bra kod 1
Här är min bra kod 2
Här är min bra kod 3
Här är min bra kod 4
Här är min bra kod 5
Här är min bra kod 6
Här är min bra kod 7
Här är min bra kod 8
Här är min dåliga kod 1 <-- BUG INTRODUCED HERE
Här är min dåliga kod 2
Här är min dåliga kod 3
Här är min dåliga kod 4

Vi ser att testets tillstånd.txt är i post-bug-tillståndet. Så det är i dåligt skick. Så vi meddelar bisect-kommandot:

$ git bisect dåligt

Produktion:

Halvering: 2 ändringar kvar att testa efter detta (ungefär 1 steg)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Mitt engagemang 9

Det flyttar vår kod för att begå 9. Vi testar igen:

$ cat test.Text

Produktion:

Här är min bra kod 1
Här är min bra kod 2
Här är min bra kod 3
Här är min bra kod 4
Här är min bra kod 5
Här är min bra kod 6
Här är min bra kod 7
Här är min bra kod 8
Här är min dåliga kod 1 <-- BUG INTRODUCED HERE

Vi ser att vi har hittat startpunkten för felet. Åtagandet “a33e366 My commit 9” är den skyldige.

Slutligen sätter vi allt tillbaka till det normala genom att:

$ git bisect reset

Produktion:

Tidigare HEAD-position var a33e366 ... Mitt åtagande 9
Bytt till filial "master"

Situation 2

I samma exempel, låt oss prova en situation där en annan utvecklare börjar med förutsättningen att felet introducerades mellan v1.0.0 och v1.0.3. Vi kan starta processen igen:

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

Produktion:

Halvskärning: 4 ändringar kvar att testa efter detta (ungefär två steg)
[8995d427668768af88266f1e78213506586b0157] Mitt engagemang 7 (v1.0.2)

Bisect har flyttat vår kod för att begå 7 eller v1.0.2. Låt oss köra vårt test:

$ cat test.Text

Produktion:

Här är min bra kod 1
Här är min bra kod 2
Här är min bra kod 3
Här är min bra kod 4
Här är min bra kod 5
Här är min bra kod 6
Här är min bra kod 7

Vi ser ingen dålig kod. Så, låt git bisect veta:

$ git bisect bra

Produktion:

Halvering: 2 ändringar kvar att testa efter detta (ungefär 1 steg)
[a33e366ad9f6004a61a468b48b36e0c0c802a815] Mitt engagemang 9

Det har fått oss att åta oss 9. Vi testar igen:

$ cat test.Text

Produktion:

Här är min bra kod 1
Här är min bra kod 2
Här är min bra kod 3
Här är min bra kod 4
Här är min bra kod 5
Här är min bra kod 6
Här är min bra kod 7
Här är min bra kod 8
Här är min dåliga kod 1 <-- BUG INTRODUCED HERE

Vi har återigen hittat det åtagande som introducerade felet. Det var begåvningen “a33e366 My commit 9”. Även om vi började med olika misstankar, hittade vi samma fel i några steg.

Låt oss återställa:

$ git bisect reset

Produktion:

Tidigare HEAD-position var a33e366 ... Mitt åtagande 9
Bytt till filial "master"

Slutsats

Som du kan se från exemplet låter git bisect oss hitta ett problem snabbare. Det är ett utmärkt verktyg för att förbättra din produktivitet. I stället för att gå igenom hela historien om åtaganden kan du ta ett mer systematiskt tillvägagångssätt för felsökning.

Ytterligare studier:

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

Hur man använder GameConqueror Cheat Engine i Linux
Artikeln täcker en guide om hur du använder GameConqueror-fuskmotorn i Linux. Många användare som spelar spel på Windows använder ofta applikationen "...
Bästa spelkonsolemulatorer för Linux
Den här artikeln listar populära spelkonsolemuleringsprogram som finns tillgängliga för Linux. Emulation är ett mjukvarukompatibilitetsskikt som emule...
Bästa Linux Distros för spel 2021
Linux-operativsystemet har kommit långt från sitt ursprungliga, enkla, serverbaserade utseende. Detta operativsystem har förbättrats enormt de senaste...