GIT-Tutorial: Arbeitsverzeichnis, Index und Objektspeicher
Vorbemerkung
In diesem Kapitel geht es um GIT-Interna, die am Anfang nicht so wichtig sind, für fortgeschrittenes Verständnis aber hilfreich sind.
GIT kennt drei Schichten:
- Das Arbeitsverzeichnis: Dort befinden sich die Dateien nach dem Auschecken.
- Der Index: Hier wird gesammelt, was zum nächsten Commit ansteht.
- Der Objektspeicher: Die Datenbank, die Objekte folgender Typen enthält:
- Blobs: Dahinter verbergen sich die Dateiinhalte
- Trees: Diese beinhalten die Zuordnung zwischen Datei/Pfadnamen und Blobs.
Arbeitsverzeichnis
Das Arbeitsverzeichnis stellt den Bereich dar, in dem der Benutzer mit den Dateien des Repository arbeitet, d.h. anschaut und verändert. Zum Arbeitsverzeichnis gehören alle Dateien und Unterverzeichnisse des Repositories außer .git.
Folgende Kommanos beeinflussen das Arbeitsverzeichnis:
- git checkout <branch>: Es werden alle Dateien auf den Stand des genannten Branches gebracht
- git reset --hard ...: Ein oder mehrere Dateien werden auf einen genannten Stand gebracht, evt. Änderungen verworfen.
Index
Im Index merkt sich GIT, was zum Commit ansteht.
Wichtig: Es werden hier keine Inhalte gespeichert
Für den Normalanwender ist die Existenz des Index nur soweit wichtig, dass er nicht vergisst, vor dem Commit den Index zu aktualisieren (mittels "git add" oder der Option -a bei "git commit -a".
Kommandos, die den Index beeinflussen:
- git add
- git commit -a
- git reset --middle
- git reset --hard
Der Index ist in der Datei .git/index gespeichert.
Objektspeicher
Der Objektspeicher ("object store") werden die eigentlichen Historieninformationen gespeichert. Dabei wird ein "Inhalt" in einem Blob (das ist eine Datei) mit dem Namen des SHA1-Hashcodes als Pfad/Dateiname gespeichert.
Beispiel:
mkdir /tmp/test ; chdir /tmp/test
git init
echo abc >demo.txt
git add demo.txt
git commit -m "Demo-Datei" demo.txt
find .git/objects/ -type f
.git/objects/b4/40a9307b57cd8904f70c8f4cf2419cbb84aebc .git/objects/8b/aef1b4abc478178b004d62031cf7fe6db6f903 .git/objects/fd/71bb194690c2ccc1100c03f93be038c62d3189
Es wurden im Objektspeicher drei Objekte abgelegt. Dabei ist zu beachten, dass die ersten 2 Hexziffern des SHA1-Hashcode im Verzeichnisnamen stecken, der Rest im Dateinamen.
Git bietet die Möglichkeit, den Inhalt zu einem Hashcode zu ermitteln. Hinweis: Der Hashcode kann soweit abgekürzt werden, solange er noch eindeutig ist und mindestens 4 Zeichen enthält.
git cat-file -p b440
100644 blob 8baef1b4abc478178b004d62031cf7fe6db6f903 demo.txt
git cat-file -p 8bae
abc
git cat-file -p fd7
tree b440a9307b57cd8904f70c8f4cf2419cbb84aebc author hamatoma <hamatoma@gmx.de> 1314516801 +0200 committer hamatoma <hamatoma@gmx.de> 1314516801 +0200 Demo-Datei
Die drei Objekte sind das Tree-Objekt (mit dem Dateinamen "demo.txt"), der Inhalt der Datei "abc" und der Commit-Eintrag "tree...".
Im Commit-Eintrag wird das Tree-Objekt, referenziert: b440a9307b57cd8904f70c8f4cf2419cbb84aebc. Dass das Tree-Objekt mehr enthält als den Dateinamen, zeigt ein Hexdump:
hd git/objects/b4/40a9307b57cd8904f70c8f4cf2419cbb84aebc
00000000 78 01 2b 29 4a 4d 55 30 36 63 30 34 30 30 33 31 |x.+)JMU06c040031| 00000010 51 48 49 cd cd d7 2b a9 28 61 e8 5e f7 71 cb ea |QHI...+.(a.^.q..| 00000020 23 15 e2 dd 0c be 49 cc 32 df ff e5 6e fb c9 0c |#.....I.2...n...| 00000030 00 4a 64 11 05 |.Jd..|