-
1. Kom igång
- 1.1 Om versionshantering
- 1.2 En kort historik om Git
- 1.3 Vad är Git?
- 1.4 Kommandoraden
- 1.5 Installera Git
- 1.6 Första gången med Git
- 1.7 Få hjälp
- 1.8 Sammanfattning
-
2. Grunderna i Git
- 2.1 Att få tag i ett Git‑kodförråd
- 2.2 Spara ändringar i kodförrådet
- 2.3 Visa incheckningshistoriken
- 2.4 Ångra saker
- 2.5 Arbeta med fjärrkodförråd
- 2.6 Att tagga
- 2.7 Git-alias
- 2.8 Sammanfattning
-
3. Git-grenar
- 3.1 Grenar i korthet
- 3.2 Grundläggande gren- och sammanfogningsarbete
- 3.3 Grenhantering
- 3.4 Arbetsflöden med grenar
- 3.5 Fjärrgrenar
- 3.6 Ombasering
- 3.7 Sammanfattning
-
4. Git på servern
- 4.1 Protokollen
- 4.2 Konfigurera Git på en server
- 4.3 Generera din publika SSH-nyckel
- 4.4 Konfigurera servern
- 4.5 Git-demon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 Tredjepartsalternativ
- 4.10 Sammanfattning
-
5. Distribuerat Git
-
6. GitHub
-
7. Git-verktyg
- 7.1 Revisionsurval
- 7.2 Interaktiv köläggning
- 7.3 Lägga undan och städa
- 7.4 Signera ditt arbete
- 7.5 Sökning
- 7.6 Skriva om historik
- 7.7 Nollställning förklarad
- 7.8 Avancerad sammanslagning
- 7.9 Rerere
- 7.10 Felsöka med Git
- 7.11 Undermoduler
- 7.12 Bunta
- 7.13 Ersätt
- 7.14 Lagring av inloggningsuppgifter
- 7.15 Sammanfattning
-
8. Anpassa Git
- 8.1 Git‑konfiguration
- 8.2 Git‑attribut
- 8.3 Git‑krokar
- 8.4 Ett exempel på Git‑upprätthållen policy
- 8.5 Sammanfattning
-
9. Git och andra system
- 9.1 Git som klient
- 9.2 Migrera till Git
- 9.3 Sammanfattning
-
10. Git bakom kulisserna
- 10.1 Lågnivådel och användardel
- 10.2 Git-objekt
- 10.3 Git-referenser
- 10.4 Packfiler
- 10.5 Refspecen
- 10.6 Överföringsprotokoll
- 10.7 Underhåll och dataåterställning
- 10.8 Miljövariabler
- 10.9 Sammanfattning
-
A1. Bilaga A: Git i andra miljöer
- A1.1 Grafiska gränssnitt
- A1.2 Git i Visual Studio
- A1.3 Git i Visual Studio Code
- A1.4 Git i IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine
- A1.5 Git i Sublime Text
- A1.6 Git i Bash
- A1.7 Git i Zsh
- A1.8 Git i PowerShell
- A1.9 Sammanfattning
-
A2. Bilaga B: Bädda in Git i dina applikationer
- A2.1 Git på kommandoraden
- A2.2 Libgit2
- A2.3 JGit
- A2.4 go-git
- A2.5 Dulwich
-
A3. Bilaga C: Git-kommandon
- A3.1 Uppstart och konfiguration
- A3.2 Skaffa och skapa projekt
- A3.3 Grundläggande ögonblicksbilder
- A3.4 Grening och sammanslagning
- A3.5 Dela och uppdatera projekt
- A3.6 Inspektion och jämförelse
- A3.7 Felsökning
- A3.8 Patchning
- A3.9 E‑post
- A3.10 Externa system
- A3.11 Administration
- A3.12 Lågnivåkommandon
7.10 Git-verktyg - Felsöka med Git
Felsöka med Git
Förutom att i första hand vara ett verktyg för versionshantering erbjuder Git också några kommandon som hjälper dig att felsöka källkodsprojekt. Eftersom Git är byggt för att hantera nästan vilken typ av innehåll som helst är verktygen ganska generella, men de kan ofta hjälpa dig att jaga ett programfel eller en skyldig när något går snett.
Filannotering
Om du spårar ett programfel i din kod och vill veta när det introducerades och varför, är filannotering ofta ditt bästa verktyg.
Det visar vilken incheckning som senast ändrade varje rad i en fil.
Så om du ser att en metod i din kod är felaktig kan du annotera filen med git blame för att avgöra vilken incheckning som var ansvarig för att den raden introducerades.
Följande exempel använder git blame för att avgöra vilken incheckning och incheckare som var ansvarig för rader i Linuxkärnans Makefile på toppnivå och använder dessutom flaggan -L för att begränsa utdata till raderna 69–82 i filen:
$ git blame -L 69,82 Makefile
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 69) ifeq ("$(origin V)", "command line")
b8b0618cf6fab (Cheng Renquan 2009-05-26 16:03:07 +0800 70) KBUILD_VERBOSE = $(V)
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 71) endif
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 72) ifndef KBUILD_VERBOSE
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 73) KBUILD_VERBOSE = 0
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 74) endif
^1da177e4c3f4 (Linus Torvalds 2005-04-16 15:20:36 -0700 75)
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 76) ifeq ($(KBUILD_VERBOSE),1)
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 77) quiet =
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 78) Q =
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 79) else
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 80) quiet=quiet_
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 81) Q = @
066b7ed955808 (Michal Marek 2014-07-04 14:29:30 +0200 82) endif
Observera att det första fältet är den förkortade SHA‑1:an för incheckningen som senast ändrade raden.
De två nästa fälten är värden som hämtats från den incheckningen — författarnamn och författardatum — så att du lätt kan se vem som ändrade raden och när.
Efter det kommer radnumret och filens innehåll.
Notera också ^1da177e4c3f4‑raderna, där ^‑prefixet markerar rader som infördes i kodförrådets första incheckning och har varit oförändrade sedan dess.
Det kan vara förvirrande, eftersom du nu har sett minst tre sätt som Git använder ^ för att modifiera en SHA-1-referens, men här är det just den betydelsen som gäller.
En annan cool sak med Git är att den inte spårar filnamnsbyten explicit.
Den registrerar ögonblicksbilder och försöker sedan lista ut vad som byttes namn implicit i efterhand.
En intressant följd av detta är att du kan be den räkna ut alla möjliga kodförflyttningar också.
Om du skickar flaggan -C till git blame analyserar Git filen du annoterar och försöker räkna ut var kodsnuttar i den ursprungligen kom ifrån om de kopierades från någon annanstans.
Till exempel, säg att du refaktorerar en fil med namnet GITServerHandler.m till flera filer, där en av dem är GITPackUpload.m.
Genom att köra git blame på GITPackUpload.m med flaggan -C kan du se var kodavsnitt ursprungligen kom ifrån:
$ git blame -C -L 141,153 GITPackUpload.m
f344f58d GITServerHandler.m (Scott 2009-01-04 141)
f344f58d GITServerHandler.m (Scott 2009-01-04 142) - (void) gatherObjectShasFromC
f344f58d GITServerHandler.m (Scott 2009-01-04 143) {
70befddd GITServerHandler.m (Scott 2009-03-22 144) //NSLog(@"GATHER COMMI
ad11ac80 GITPackUpload.m (Scott 2009-03-24 145)
ad11ac80 GITPackUpload.m (Scott 2009-03-24 146) NSString *parentSha;
ad11ac80 GITPackUpload.m (Scott 2009-03-24 147) GITCommit *commit = [g
ad11ac80 GITPackUpload.m (Scott 2009-03-24 148)
ad11ac80 GITPackUpload.m (Scott 2009-03-24 149) //NSLog(@"GATHER COMMI
ad11ac80 GITPackUpload.m (Scott 2009-03-24 150)
56ef2caf GITServerHandler.m (Scott 2009-01-05 151) if(commit) {
56ef2caf GITServerHandler.m (Scott 2009-01-05 152) [refDict setOb
56ef2caf GITServerHandler.m (Scott 2009-01-05 153)
Det är verkligen användbart. Normalt får du som ursprunglig incheckning den incheckning där du kopierade koden, eftersom det är första gången du rörde de raderna i filen. Git talar om vilken incheckning du skrev de raderna i från början, även om det var i en annan fil.
Bisektering
Att annotera en fil hjälper om du redan vet var problemet finns.
Om du inte vet vad som går sönder och det har gått dussintals eller hundratals incheckningar sedan den senaste versionen där du vet att koden fungerade, kommer du sannolikt att använda git bisect för hjälp.
Kommandot bisect gör en bisektering i din incheckningshistorik för att hjälpa dig identifiera så snabbt som möjligt vilken incheckning som introducerade problemet.
Säg att du just har publicerat en utgåva av din kod till en produktionsmiljö, du får felrapporter om något som inte hände i din utvecklingsmiljö, och du kan inte förstå varför koden beter sig så.
Du går tillbaka till koden och upptäcker att du kan återskapa problemet, men du kan inte lista ut vad som går fel.
Du kan bisektera koden för att ta reda på det.
Först kör du git bisect start för att komma igång, och sedan använder du git bisect bad för att tala om för systemet att den incheckning du står på är trasig.
Sedan måste du tala om för bisekteringen när det senaste kända bra läget var, med git bisect good <bra_incheckning>:
$ git bisect start
$ git bisect bad
$ git bisect good v1.0
Bisecting: 6 revisions left to test after this
[ecb6e1bc347ccecc5f9350d878ce677feb13d3b2] Error handling on repo
Git räknade ut att ungefär 12 incheckningar låg mellan incheckningen du markerade som senaste bra (v1.0) och den nuvarande trasiga versionen, och växlade till den mittersta åt dig.
Vid det här laget kan du köra ditt test för att se om problemet finns i den här incheckningen.
Om det gör det introducerades det någon gång före den här mittersta incheckningen; om det inte gör det introducerades problemet någon gång efter den mittersta incheckningen.
Det visar sig att det inte finns något problem här, och du talar om för Git genom att skriva git bisect good och fortsätter din resa:
$ git bisect good
Bisecting: 3 revisions left to test after this
[b047b02ea83310a70fd603dc8cd7a6cd13d15c04] Secure this thing
Nu är du på en annan incheckning, halvvägs mellan den du just testade och din trasiga incheckning.
Du kör ditt test igen och upptäcker att den här incheckningen är trasig, så du talar om det för Git med git bisect bad:
$ git bisect bad
Bisecting: 1 revisions left to test after this
[f71ce38690acf49c1f3c9bea38e09d82a5ce6014] Drop exceptions table
Den här incheckningen är bra, och nu har Git all information den behöver för att avgöra var problemet introducerades. Den talar om SHA‑1:an för den första trasiga incheckningen och visar en del av incheckningsinformationen och vilka filer som ändrades i den incheckningen så att du kan lista ut vad som hände som kan ha introducerat programfelet:
$ git bisect good
b047b02ea83310a70fd603dc8cd7a6cd13d15c04 is first bad commit
commit b047b02ea83310a70fd603dc8cd7a6cd13d15c04
Author: PJ Hyett <pjhyett@example.com>
Date: Tue Jan 27 14:48:32 2009 -0800
Secure this thing
:040000 040000 40ee3e7821b895e52c1695092db9bdc4c61d1730
f24d3c6ebcfc639b1a3814550e62d60b8e68a8e4 M config
När du är klar bör du köra git bisect reset för att återställa din HEAD till där du var innan du började, annars hamnar du i ett märkligt läge:
$ git bisect reset
Det är ett kraftfullt verktyg som kan hjälpa dig att kontrollera hundratals incheckningar efter ett introducerat programfel på några minuter.
Faktum är att om du har ett skript som returnerar 0 om projektet är bra eller något annat än 0 om projektet är dåligt kan du helt automatisera git bisect.
Först anger du återigen intervallet för bisekteringen genom att ange den kända dåliga och den kända bra incheckningen.
Du kan göra detta genom att lista dem med kommandot bisect start om du vill, och lista den kända dåliga incheckningen först och den kända bra incheckningen som tvåa:
$ git bisect start HEAD v1.0
$ git bisect run test-error.sh
När du gör det körs test-error.sh automatiskt på varje utlagd incheckning tills Git hittar den första trasiga incheckningen.
Du kan också köra något som make eller make tests eller vad du nu har som kör automatiserade tester åt dig.