Versionsverwaltung
Nun kommen wir aber endlich auch zu der eigentlichen Stärke von git, nämlich der Versionsverwaltung.
Bisher haben wir drei verschiedene Versionen der Testdatei in unser lokales Repository eingecheckt. Nach wie vor sind alle diese drei Versionen dort noch vorhanden und wir können uns die gesamte Historie anzeigen lassen mit dem Befehl:
git log
Beachte, dass unsere früher mit der Option -m übergebenen Commit-Messages dabei mit angezeigt werden. Weiterhin werden auch noch jeweils der Name der Entwickler*in, ihre Emailadresse sowie das Checkin-Datum der Dateien angezeigt.
Die einzelnen Versionen unserer Testdatei werden mit einem SHA-1-Hashwert identifiziert, der ebenfalls in der Konsoleausgabe angezeigt wird. Über die Identifikation der verschiedenen Versionen dient der gespeicherte Hashwert übrigens gleichzeitig auch dazu, die Integrität der im lokalen Repository gespeicherten Dateien sicherzustellen.
Weiter oben ist uns bereits das Schlüsselwort HEAD begegnet, welches eine Referenz auf eine der eingecheckten Versionen im lokalen Repository ist. in unserem Fall zeigt HEAD auf die letzte eingecheckte Version, also auf Version 3.
Beachte hierbei, dass jeweils die Nachfolgeversion auf die Vorgängerversion zeigt, während es {\em keine} Referenz in der umgekehrten Richtung gibt. Man kann also von einer bestimmten Version leicht zu deren Vorgänger gelangen, nicht aber umgekehrt.
Wechsel zu anderen Versionen
Der Befehl git-log sollte nun die drei Versionen anzeigen, die wir weiter oben eingecheckt haben.
Mit dem folgenden Befehl können wir nun die Vorgängerversion von HEAD auschecken, und zwar sowohl in den Index als auch ins Arbeitsverzeichnis:
git checkout HEAD~1 test-datei.txt
Damit hat unser Projekt als nun den Zustand:
HEAD: Version 3
Index: Version 2
Arbeitsverzeichnis: Version 2
Anmerkung 1:
HEAD~<n> steht für die n-te Vorgängerversion von HEAD. HEAD~, ist äquivalent zu HEAD~1Anmerkung 2:
Man könnte eine bestimmte Version auch mit dem folgenden Befehl auschecken:
git checkout <sha-1-id>
Aber Vorsicht:
Dies führt zu einem so genannten detached head, d.h. die Referenz HEAD zeigt anschließend auf die ausgecheckte Version, so dass neu einzucheckende Versionen nicht mehr hinter der neuesten Version eingefügt würden. Man kann den HEAD aber wieder zurück auf die neueste Version setzen, indem man diese z.B. anhand ihrer sha-1-id wie oben beschrieben erneut auscheckt.
Ein detached head Zustand ist problematisch, da in diesem Zustand eingecheckte Versionen an der Stelle des detached head eingecheckt werden und ohne Kenntnis deren sha-1 Wertes nicht mehr aufgefunden werden können. Daher sollten detached head Zustände in der Regel vermieden werden und stattdessen ein so genannter Branch erzeugt werden. Branches werden weiter unten noch ausführlicher behandelt.
Vergleich von Versionen mit diff und diff HEAD
Mit den folgenden Befehlen lassen sich jeweils verschiedene Versionen unserer Testdatei miteinander vergleichen.
1. Vergleich der Datei im Arbeitsverzeichnis mit dem Index:
git diff
2. Vergleich der Datei im Arbeitsverzeichnis mit dem lokalen Respository:
git diff < HEAD | sha-1-id>
3. Vergleich von Versionen im lokalen Respository:
git diff <erste sha-1-id> <zweite sha-1-id>