GIT-Tutorial: Arbeitsverzeichnis, Index und Objektspeicher: Unterschied zwischen den Versionen

Aus Info-Theke
Zur Navigation springen Zur Suche springen
(Syntax-Hilighting, Trennung Kommandos / Ausgabe)
 
K (1 Version)
(kein Unterschied)

Version vom 10. September 2011, 09:18 Uhr

GIT-Tutorial: Übersicht

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..|