-
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.5 Git-verktyg - Sökning
Sökning
Oavsett kodbasens storlek behöver du ofta hitta var en funktion anropas eller definieras, eller visa historiken för en metod. Git erbjuder ett par användbara verktyg för att snabbt och enkelt leta igenom kod och incheckningar som finns lagrade i databasen. Vi går igenom några av dem.
Git-grep
Git levereras med kommandot grep som låter dig enkelt söka igenom valfritt checkat in träd, arbetskatalogen eller till och med indexet efter en sträng eller ett reguljärt uttryck.
För exemplen som följer söker vi i Git-källkoden.
Som standard tittar git grep igenom filerna i din arbetskatalog.
Som en första variant kan du använda -n eller --line-number för att skriva ut radnumren där Git har hittat träffar:
$ git grep -n gmtime_r
compat/gmtime.c:3:#undef gmtime_r
compat/gmtime.c:8: return git_gmtime_r(timep, &result);
compat/gmtime.c:11:struct tm *git_gmtime_r(const time_t *timep, struct tm *result)
compat/gmtime.c:16: ret = gmtime_r(timep, result);
compat/mingw.c:826:struct tm *gmtime_r(const time_t *timep, struct tm *result)
compat/mingw.h:206:struct tm *gmtime_r(const time_t *timep, struct tm *result);
date.c:482: if (gmtime_r(&now, &now_tm))
date.c:545: if (gmtime_r(&time, tm)) {
date.c:758: /* gmtime_r() in match_digit() may have clobbered it */
git-compat-util.h:1138:struct tm *git_gmtime_r(const time_t *, struct tm *);
git-compat-util.h:1140:#define gmtime_r git_gmtime_r
Utöver den grundläggande sökningen ovan stödjer git grep en mängd andra intressanta alternativ.
Du kan till exempel, i stället för att skriva ut alla träffar, be git grep sammanfatta utdata genom att bara visa vilka filer som innehöll söksträngen och hur många träffar som fanns i varje fil med -c eller --count:
$ git grep --count gmtime_r
compat/gmtime.c:4
compat/mingw.c:1
compat/mingw.h:1
date.c:3
git-compat-util.h:2
Om du är intresserad av sammanhanget kring en söksträng kan du visa omslutande metod eller funktion för varje träff med -p eller --show-function:
$ git grep -p gmtime_r *.c
date.c=static int match_multi_number(timestamp_t num, char c, const char *date,
date.c: if (gmtime_r(&now, &now_tm))
date.c=static int match_digit(const char *date, struct tm *tm, int *offset, int *tm_gmt)
date.c: if (gmtime_r(&time, tm)) {
date.c=int parse_date_basic(const char *date, timestamp_t *timestamp, int *offset)
date.c: /* gmtime_r() in match_digit() may have clobbered it */
Som du kan se anropas rutinen gmtime_r från både funktionerna match_multi_number och match_digit i filen date.c (den tredje träffen som visas representerar bara att strängen förekommer i en kommentar).
Du kan också söka efter mer komplexa kombinationer av strängar med flaggan --and, som säkerställer att flera träffar måste förekomma på samma textrad.
Till exempel kan vi leta efter rader som definierar en konstant vars namn innehåller antingen delsträngen “LINK” eller “BUF_MAX”, specifikt i en äldre version av Git-kodbasen representerad av taggen v1.8.0 (vi lägger till --break och --heading som gör utdata mer läsbar):
$ git grep --break --heading \
-n -e '#define' --and \( -e LINK -e BUF_MAX \) v1.8.0
v1.8.0:builtin/index-pack.c
62:#define FLAG_LINK (1u<<20)
v1.8.0:cache.h
73:#define S_IFGITLINK 0160000
74:#define S_ISGITLINK(m) (((m) & S_IFMT) == S_IFGITLINK)
v1.8.0:environment.c
54:#define OBJECT_CREATION_MODE OBJECT_CREATION_USES_HARDLINKS
v1.8.0:strbuf.c
326:#define STRBUF_MAXLINK (2*PATH_MAX)
v1.8.0:symlinks.c
53:#define FL_SYMLINK (1 << 2)
v1.8.0:zlib.c
30:/* #define ZLIB_BUF_MAX ((uInt)-1) */
31:#define ZLIB_BUF_MAX ((uInt) 1024 * 1024 * 1024) /* 1GB */
Kommandot git grep har några fördelar jämfört med vanliga sökkommandon som grep och ack.
Den första är att det är riktigt snabbt, den andra är att du kan söka igenom vilket träd som helst i Git, inte bara arbetskatalogen.
Som vi såg i exemplet ovan letade vi efter termer i en äldre version av Git-källkoden, inte versionen som för närvarande var utlagd.
Söka i Git-loggen
Kanske söker du inte var en term finns, utan när den fanns eller introducerades.
Kommandot git log har en rad kraftfulla verktyg för att hitta specifika incheckningar utifrån innehållet i deras meddelanden eller till och med innehållet i diffen de introducerar.
Om vi till exempel vill ta reda på när konstanten ZLIB_BUF_MAX ursprungligen introducerades kan vi använda flaggan -S (i dagligt tal kallat Gits "hacka"-läge) för att säga åt Git att bara visa de incheckningar som ändrade antalet förekomster av den strängen.
$ git log -S ZLIB_BUF_MAX --oneline
e01503b zlib: allow feeding more than 4GB in one go
ef49a7a zlib: zlib can only process 4GB at a time
Om vi tittar på diffen för dessa incheckningar kan vi se att i ef49a7a introducerades konstanten och i e01503b modifierades den.
Om du behöver vara mer specifik kan du ange ett reguljärt uttryck att söka efter med -G.
Radloggsökning
En annan ganska avancerad loggsökning som är otroligt användbar är sökning i radhistoriken.
Kör helt enkelt git log med flaggan -L, så visar den historiken för en funktion eller rad kod i din kodbas.
Om vi till exempel vill se varje ändring som gjorts i funktionen git_deflate_bound i filen zlib.c kan vi köra git log -L :git_deflate_bound:zlib.c.
Detta försöker räkna ut var gränserna för funktionen går och går sedan igenom historiken och visar oss varje ändring som gjorts i funktionen som en serie ändringspatchar tillbaka till när funktionen först skapades.
$ git log -L :git_deflate_bound:zlib.c
commit ef49a7a0126d64359c974b4b3b71d7ad42ee3bca
Author: Junio C Hamano <gitster@pobox.com>
Date: Fri Jun 10 11:52:15 2011 -0700
zlib: zlib can only process 4GB at a time
diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -85,5 +130,5 @@
-unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+unsigned long git_deflate_bound(git_zstream *strm, unsigned long size)
{
- return deflateBound(strm, size);
+ return deflateBound(&strm->z, size);
}
commit 225a6f1068f71723a910e8565db4e252b3ca21fa
Author: Junio C Hamano <gitster@pobox.com>
Date: Fri Jun 10 11:18:17 2011 -0700
zlib: wrap deflateBound() too
diff --git a/zlib.c b/zlib.c
--- a/zlib.c
+++ b/zlib.c
@@ -81,0 +85,5 @@
+unsigned long git_deflate_bound(z_streamp strm, unsigned long size)
+{
+ return deflateBound(strm, size);
+}
+
Om Git inte kan lista ut hur den ska matcha en funktion eller metod i ditt programmeringsspråk kan du också ge den ett reguljärt uttryck (eller "reguttryck").
Till exempel hade detta gjort samma sak som exemplet ovan: git log -L '/unsigned long git_deflate_bound/',/^}/:zlib.c.
Du kan också ge den ett intervall av rader eller ett enstaka radnummer så får du samma sorts utdata.