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:

  1. Maak blobs en trees om uw projectmap weer te geven - opgeslagen in .git/objects
  2. Maakt een nieuw commit object met uw auteursinformatie, commit-bericht en de root tree van stap 1 - ook opgeslagen in .git/objects
  3. .git/HEAD de HEAD referentie in .git/HEAD naar de hash van de nieuw gemaakte commit

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.

  1. Werk de bestanden in de werkmap bij zodat deze overeenkomen met de tree in de commit
  2. 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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow