Sök…
Repo
Ett git repository
är en datastruktur på disken som lagrar metadata för en uppsättning filer och kataloger.
Det lever i projektets .git/
folder. Varje gång du förbinder data till git lagras det här. .git/
innehåller .git/
innehåller varje åtagande.
Den grundläggande strukturen är så här:
.git/
objects/
refs/
Objekt
git
är i grunden en nyckelvärdesbutik. När du lägger till data i git
bygger det ett object
och använder SHA-1-hash för object
innehåll som en nyckel.
Därför kan allt innehåll i git
letas upp med sin hash:
git cat-file -p 4bb6f98
Det finns fyra typer av Object
:
-
blob
-
tree
-
commit
-
tag
HEAD ref
HEAD
är en speciell ref
. Den pekar alltid på det aktuella objektet.
Du kan se var den pekar för närvarande genom att kontrollera .git/HEAD
filen.
Normalt pekar HEAD
på en annan ref
:
$cat .git/HEAD
ref: refs/heads/mainline
Men det kan också peka direkt på ett object
:
$ cat .git/HEAD
4bb6f98a223abc9345a0cef9200562333
Det här är det som kallas ett "fristående huvud" - eftersom HEAD
inte är kopplad till (pekar på) någon ref
, utan snarare pekar direkt på ett object
.
refs
En ref
är i huvudsak en pekare. Det är ett namn som pekar på ett object
. Till exempel,
"master" --> 1a410e...
De lagras i `.git / refs / heads / i vanliga textfiler.
$ cat .git/refs/heads/mainline
4bb6f98a223abc9345a0cef9200562333
Detta är vanligtvis vad som kallas branches
. Du kommer dock att notera att i git
finns det inget som en branch
- bara en ref
.
Nu är det möjligt att navigera git
rent genom att hoppa runt till olika objects
direkt genom deras hash. Men detta skulle vara oerhört obekvämt. En ref
ger dig ett bekvämt namn att hänvisa till objects
efter. Det är mycket lättare att be git
att gå till en specifik plats med namn snarare än med hash.
Engagera objekt
En commit
är förmodligen den object
som är mest känd för git
användare, eftersom det är vad de är vana vid att skapa med git commit
kommandona.
commit
innehåller emellertid inte direkt några ändrade filer eller data. Snarare innehåller den mestadels metadata och pekare på andra objects
som innehåller det verkliga innehållet i commit
.
Ett commit
innehåller några saker:
- hash av ett
tree
- hash av en förälder
commit
- författarnamn / e-post, pendlarnamn / e-post
- begå meddelandet
Du kan se innehållet i alla åtaganden som detta:
$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <[email protected]>
commiter Neil Peart <[email protected]>
First commit!
Träd
En mycket viktig anmärkning är att tree
objekt butiker varje fil i projektet, och den lagrar hela filer inte diffar. Detta innebär att varje commit
innehåller en ögonblicksbild av hela projektet *.
* Tekniskt sett lagras bara ändrade filer. Men detta är mer en implementeringsdetalj för effektivitet. Ur ett designperspektiv bör en commit
anses innehålla en fullständig kopia av projektet .
Förälder
Den parent
raden innehåller en hash av ett annat commit
och kan betraktas som en "överordnad pekare" som pekar på "föregående åtagande". Detta bildar implicit en graf över åtaganden som kallas åtagandegrafen . Specifikt är det en riktad acyklisk graf (eller DAG).
Trädobjekt
Ett tree
representerar i princip en mapp i ett traditionellt filsystem: kapslade behållare för filer eller andra mappar.
Ett tree
innehåller:
- 0 eller fler
blob
- 0 eller flera
tree
Precis som du kan använda ls
eller dir
att visa innehållet i en mapp kan du visa innehållet i en tree
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
...
Du kan leta upp filerna i ett commit
genom att först hitta hash för tree
i commit
och sedan titta på det tree
:
$ git cat-file commit 4bb6f93a
tree 07b1a631
parent ...
author ...
commiter ...
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
...
Blob-objekt
En blob
innehåller godtyckligt binärt filinnehåll. Vanligtvis kommer det att vara rå text som källkod eller en bloggartikel. Men det kan lika lätt vara byte för en PNG-fil eller något annat.
Om du har hash av en blob
kan du titta på innehållet.
$ git cat-file -p d429810
package com.example.project
class Foo {
...
}
...
Till exempel kan du bläddra i ett tree
som ovan och sedan titta på en av blobs
i det.
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
100644 blob cae391ff Readme.txt
$ git cat-file -p cae391ff
Welcome to my project! This is the readmefile
...
Skapa nya åtaganden
git commit
kommandot gör några saker:
- Skapa
blobs
ochtrees
att representera din projektkatalog - lagrad i.git/objects
- Skapar ett nytt
commit
objekt med din författare information begår meddelande och rotentree
från steg 1 - också lagras i.git/objects
- Uppdaterar
HEAD
ref i.git/HEAD
till hash för det nyligen skapadecommit
Detta resulterar i att en ny ögonblicksbild av ditt projekt läggs till i git
som är ansluten till föregående tillstånd.
Flytta HEAD
När du kör git checkout
på en engagemang (specificerad av hash eller ref) ber du git
att din arbetskatalog ska se ut så som det gjorde när stillbilden togs.
- Uppdatera filerna i arbetskatalogen så att de matchar
tree
inuticommit
- Uppdatera
HEAD
att peka på den angivna hash eller ref
Flytta refs runt
Running git reset --hard
flyttar refs till den angivna hash / ref.
Flytta MyBranch
till b8dc53
:
$ git checkout MyBranch # moves HEAD to MyBranch
$ git reset --hard b8dc53 # makes MyBranch point to b8dc53
Skapa nya refs
Att köra git checkout -b <refname>
skapar en ny ref som pekar på det aktuella commit
.
$ cat .git/head
1f324a
$ git checkout -b TestBranch
$ cat .git/refs/heads/TestBranch
1f324a