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:

  1. Skapa blobs och trees att representera din projektkatalog - lagrad i .git/objects
  2. Skapar ett nytt commit objekt med din författare information begår meddelande och roten tree från steg 1 - också lagras i .git/objects
  3. Uppdaterar HEAD ref i .git/HEAD till hash för det nyligen skapade commit

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.

  1. Uppdatera filerna i arbetskatalogen så att de matchar tree inuti commit
  2. 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


Modified text is an extract of the original Stack Overflow Documentation
Licensierat under CC BY-SA 3.0
Inte anslutet till Stack Overflow