Zoeken…
repo
Een git repository
is een datastructuur op schijf die metadata opslaat voor een set bestanden en mappen.
Het leeft in de .git/
map van uw project. Elke keer dat je gegevens vastlegt om te gitsen, worden deze hier opgeslagen. Omgekeerd bevat .git/
elke enkele commit.
De basisstructuur is als volgt:
.git/
objects/
refs/
Voorwerpen
git
is fundamenteel een sleutel-waarde winkel. Wanneer je gegevens aan git
toevoegt, bouwt het een object
en gebruikt het de SHA-1 hash van de inhoud van het object
als een sleutel.
Daarom kan elke inhoud in git
worden opgezocht door zijn hash:
git cat-file -p 4bb6f98
Er zijn 4 soorten Object
:
-
blob
-
tree
-
commit
-
tag
HOOFD ref
HEAD
is een speciale ref
. Het verwijst altijd naar het huidige object.
Je kunt zien waar het momenteel naar .git/HEAD
door het .git/HEAD
bestand te controleren.
Normaal gesproken HEAD
naar een andere ref
:
$cat .git/HEAD
ref: refs/heads/mainline
Maar het kan ook direct naar een object
wijzen:
$ cat .git/HEAD
4bb6f98a223abc9345a0cef9200562333
Dit is wat bekend staat als een "losgekoppeld hoofd" - omdat HEAD
niet is bevestigd aan (wijzend op) een ref
, maar eerder direct naar een object
.
Scheidsrechters
Een ref
is in wezen een wijzer. Het is een naam die naar een object
. Bijvoorbeeld,
"master" --> 1a410e...
Ze worden opgeslagen in `.git / refs / heads / in platte tekstbestanden.
$ cat .git/refs/heads/mainline
4bb6f98a223abc9345a0cef9200562333
Dit worden meestal branches
. Je zult echter merken dat er in git
niet zoiets bestaat als een branch
- alleen een ref
.
Nu is het mogelijk om git
te navigeren puur door rond te springen naar verschillende objects
direct door hun hashes. Maar dit zou vreselijk lastig zijn. Een ref
geeft u een handige naam om naar objects
te verwijzen. Het is veel gemakkelijker om git
te vragen naar een specifieke plaats te gaan op naam in plaats van op hash.
Object vastleggen
Een commit
is waarschijnlijk het meest bekende object
voor git
gebruikers, want het is wat ze gewend zijn te maken met de git commit
opdrachten.
De commit
bevat echter niet direct gewijzigde bestanden of gegevens. Het bevat eerder metadata en verwijzingen naar andere objects
die de daadwerkelijke inhoud van de commit
.
Een commit
bevat een paar dingen:
- hash van een
tree
- hash van een ouder-
commit
- auteursnaam / e-mailadres, commiternaam / e-mailadres
- bericht plegen
Je kunt de inhoud van elke commit zoals deze zien:
$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <[email protected]>
commiter Neil Peart <[email protected]>
First commit!
Boom
Een zeer belangrijke opmerking is dat de tree
slaat elk bestand objecten in uw project, en het slaat hele bestanden niet diffs. Dit betekent dat elke commit
een momentopname van het hele project bevat *.
* Technisch gezien worden alleen gewijzigde bestanden opgeslagen. Maar dit is meer een implementatiedetail voor efficiëntie. Vanuit een ontwerpperspectief moet een commit
worden beschouwd als een volledige kopie van het project .
Ouder
De parent
regel bevat een hash van een ander commit
object en kan worden gezien als een "bovenliggende pointer" die verwijst naar de "vorige commit". Dit vormt impliciet een grafiek van commits die de commit-grafiek worden genoemd . Het is met name een gerichte acyclische grafiek (of DAG).
Boom Object
Een tree
vertegenwoordigt in feite een map in een traditioneel bestandssysteem: geneste containers voor bestanden of andere mappen.
Een tree
bevat:
- 0 of meer
blob
objecten - 0 of meer
tree
objecten
Net zoals je kunt gebruiken ls
of dir
om de inhoud van een map, kunt u de inhoud van een lijst tree
object.
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
...
Je kunt de bestanden in een commit
opzoeken door eerst de hash van de tree
in de commit
en dan naar die 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 Object
Een blob
bevat inhoud van willekeurige binaire bestanden. Gewoonlijk zal het onbewerkte tekst zijn, zoals broncode of een blogartikel. Maar het kan net zo gemakkelijk de bytes zijn van een PNG-bestand of iets anders.
Als je de hash van een blob
, kun je de inhoud bekijken.
$ git cat-file -p d429810
package com.example.project
class Foo {
...
}
...
U kunt bijvoorbeeld door een tree
bladeren zoals hierboven en vervolgens naar een van de blobs
erin kijken.
$ 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
...
Nieuwe Commits aanmaken
Het git commit
commando doet een paar dingen:
- Maak
blobs
entrees
om uw projectmap weer te geven - opgeslagen in.git/objects
- Maakt een nieuw
commit
object met uw auteursinformatie, commit-bericht en de roottree
van stap 1 - ook opgeslagen in.git/objects
-
.git/HEAD
deHEAD
referentie in.git/HEAD
naar de hash van de nieuw gemaaktecommit
Dit resulteert in een nieuw snapshot van je project dat wordt toegevoegd aan git
dat is verbonden met de vorige status.
HEAD verplaatsen
Als je git checkout
uitvoert op een commit (gespecificeerd door hash of ref), git
je git
om je werkmap eruit te laten zien zoals het deed toen de snapshot werd genomen.
- Werk de bestanden in de werkmap bij zodat deze overeenkomen met de
tree
in decommit
- Update
HEAD
zodat deze naar de opgegeven hash of ref verwijst
Bewegende refs rond
git reset --hard
verplaatst refs naar de opgegeven hash / ref.
MyBranch
verplaatsen naar b8dc53
:
$ git checkout MyBranch # moves HEAD to MyBranch
$ git reset --hard b8dc53 # makes MyBranch point to b8dc53
Nieuwe referenties maken
Het uitvoeren van git checkout -b <refname>
zal een nieuwe ref maken die git checkout -b <refname>
naar de huidige commit
.
$ cat .git/head
1f324a
$ git checkout -b TestBranch
$ cat .git/refs/heads/TestBranch
1f324a