Suche…
Repo
Ein git repository
ist eine Datenstruktur auf der Festplatte, in der Metadaten für eine Reihe von Dateien und Verzeichnissen gespeichert werden.
Es befindet sich im .git/
Ihres Projekts. Jedes Mal, wenn Sie Daten an git übergeben, werden diese hier gespeichert. Umgekehrt enthält .git/
jeden einzelnen Commit.
Ihre Grundstruktur sieht folgendermaßen aus:
.git/
objects/
refs/
Objekte
git
ist grundsätzlich ein Schlüsselwertspeicher. Wenn Sie Daten zu git
hinzufügen, wird ein object
und der SHA-1-Hash des object
als Schlüssel verwendet.
Daher kann jeder Inhalt in git
anhand seines Hashes nachgeschlagen werden:
git cat-file -p 4bb6f98
Es gibt 4 Object
:
-
blob
-
tree
-
commit
-
tag
HEAD ref
HEAD
ist ein Sonder ref
. Es zeigt immer auf das aktuelle Objekt.
Sie können sehen, wohin es aktuell zeigt, indem Sie die .git/HEAD
Datei überprüfen.
Normalerweise zeigt HEAD
auf einen anderen ref
:
$cat .git/HEAD
ref: refs/heads/mainline
Es kann aber auch direkt auf ein object
:
$ cat .git/HEAD
4bb6f98a223abc9345a0cef9200562333
Dies ist, was als "losgelöster Kopf" bekannt ist - weil HEAD
nicht mit einem ref
, sondern auf ein object
.
Refs
Ein ref
ist im Wesentlichen ein Zeiger. Es ist ein Name, der auf ein object
verweist. Zum Beispiel,
"master" --> 1a410e...
Sie werden in .git / refs / heads / in Klartextdateien gespeichert.
$ cat .git/refs/heads/mainline
4bb6f98a223abc9345a0cef9200562333
Dies wird üblicherweise als branches
. Sie ist jedoch zu beachten , dass in git
so etwas wie einen gibt es kein branch
- nur ref
.
Nun ist es möglich, git
rein zu navigieren, indem Sie direkt durch ihre Hashwerte zu verschiedenen objects
springen. Dies wäre jedoch äußerst unpraktisch. Ein ref
gibt Ihnen einen bequemen Namen, um auf objects
zu verweisen. Es ist viel einfacher, git
zu fragen, ob er an einen bestimmten Ort geht und nicht per Hash.
Commit-Objekt
Ein commit
ist wahrscheinlich der object
der für git
Benutzer am bekanntesten ist, da er üblicherweise mit den git commit
Befehlen erstellt wird.
Der commit
enthält jedoch keine geänderten Dateien oder Daten. Sie enthält vielmehr meist Metadaten und Verweise auf andere objects
, die den eigentlichen Inhalt des commit
.
Ein commit
enthält einige Dinge:
- Hasch eines
tree
- Hash eines übergeordneten
commit
- Name des Autors / E-Mail, Name des Commiters / E-Mail
- Nachricht übermitteln
Sie können den Inhalt jedes Commits folgendermaßen sehen:
$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <[email protected]>
commiter Neil Peart <[email protected]>
First commit!
Baum
Ein sehr wichtiger Hinweis ist , dass der tree
speichert jede Datei in Ihrem Projekt - Objekte und speichert ganze Dateien nicht diffs. Dies bedeutet, dass jeder commit
eine Momentaufnahme des gesamten Projekts enthält *.
* Technisch werden nur geänderte Dateien gespeichert. Dies ist jedoch eher ein Implementierungsdetail für die Effizienz. Aus commit
sollte ein commit
als vollständige Kopie des Projekts betrachtet werden .
Elternteil
Die parent
Zeile enthält einen Hash eines anderen commit
und kann als "übergeordneter Zeiger" betrachtet werden, der auf das "vorherige Festschreiben" verweist. Dies bildet implizit ein Commit-Diagramm, das als Commit-Diagramm bezeichnet wird . Insbesondere handelt es sich um eine gerichtete azyklische Grafik (DAG).
Baumobjekt
Eine tree
stellt im Wesentlichen einen Ordner in einem herkömmlichen Dateisystem dar: verschachtelte Container für Dateien oder andere Ordner.
Ein tree
enthält:
- 0 oder mehr
blob
Objekte - 0 oder mehr
tree
- Objekte
Genauso wie Sie mit ls
oder dir
den Inhalt eines Ordners auflisten können, können Sie den Inhalt eines tree
auflisten.
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
...
Sie können die Dateien in einem commit
nachschlagen commit
indem Sie zuerst den Hash des tree
im commit
suchen und dann diesen 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
Ein blob
enthält beliebige binäre Dateiinhalte. Normalerweise handelt es sich dabei um unformatierten Text wie Quellcode oder Blogartikel. Es können aber genauso einfach die Bytes einer PNG-Datei oder etwas anderes sein.
Wenn Sie den Hash eines blob
, können Sie dessen Inhalt betrachten.
$ git cat-file -p d429810
package com.example.project
class Foo {
...
}
...
Sie können zum Beispiel einen tree
wie oben durchsuchen und dann einen der blobs
darin betrachten.
$ 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
...
Neue Commits erstellen
Der Befehl git commit
führt einige Dinge aus:
- Erstellen Sie
blobs
undtrees
, um Ihr Projektverzeichnis darzustellen - in.git/objects
gespeichert - Erstellt ein neues
commit
Objekt mit Ihren Autorinformationen, der Commit-Nachricht und demtree
aus Schritt 1 - ebenfalls in.git/objects
gespeichert - Aktualisiert den
HEAD
ref in.git/HEAD
mit dem Hash des neu erstelltencommit
Dies führt dazu, dass ein neuer Snapshot Ihres Projekts zu git
hinzugefügt wird, der mit dem vorherigen Status verbunden ist.
KOPF bewegen
Wenn Sie git checkout
für ein Commit ausführen (angegeben durch Hash oder Ref), teilen Sie git
mit, dass Ihr Arbeitsverzeichnis so aussehen soll, wie es bei der Momentaufnahme gemacht wurde.
- Aktualisieren Sie die Dateien im Arbeitsverzeichnis so, dass sie der
tree
imcommit
- Aktualisieren Sie
HEAD
, dass es auf den angegebenen Hash oder Ref verweist
Refs bewegen
Das Ausführen von git reset --hard
verschiebt die Refs in den angegebenen Hash / Ref.
MyBranch
auf b8dc53
:
$ git checkout MyBranch # moves HEAD to MyBranch
$ git reset --hard b8dc53 # makes MyBranch point to b8dc53
Neue Refs erstellen
git checkout -b <refname>
wird ein neuer Ref erstellt, der auf das aktuelle commit
verweist.
$ cat .git/head
1f324a
$ git checkout -b TestBranch
$ cat .git/refs/heads/TestBranch
1f324a