git ready

Lerne Git Commit für Commit
von Nick Quaranto, Übersetzung von Nico Gulden

reflog, dein Sicherheitsnetz

eingetragen am 09 Feb 2009

Wir haben den reflog Befehl kurz in dem früheren Beitrag Verlorene Commits wieder herstellen behandelt. Er wurde aber bisher nie erklärt. Heute schauen wir uns an, wie man ihn als Sicherheitsnetz zum Wiederherstellen verwendet.

Die Manpages zu diesem Befehl sind sehr knapp gehalten:

git-reflog – Manage reflog information

Die Definition an späterer Stelle im Dokument ist ein wenig besser:

Reflog is a mechanism to record when the tip of branches are updated. This command is to manage the information recorded in it.

Übersetzung:


Reflog ist ein Mechanismus, der sich den Aktualisierungszeitpunkt der Spitze eines Zweiges merkt. Der Befehl verwaltet die aufgezeichneten Informationen.

Jede unternommene Aktion in Git wird grundsätzlich im Reflog gespeichert. Git versucht äußerst stark keine Daten zu verlieren. Wenn du also denkst, etwas verloren zu haben, stehen die Chancen recht gut, dass du sie mit git reflog wieder ausgraben kannst. Das bedeutet, der Befehl läßt sich als Sicherheitsnetz verwenden: Du brauchst dir also keine Gedanken darüber zu machen, dass ein Merge, ein Rebase oder eine andere Aktion deine Arbeit zerstört, weil du sie mit dem Befehl wieder finden kannst.

Die gebräuchlichste Verwendung von git reflog beläuft sich darin, dass du soeben ein git reset durchgeführt und den HEAD ein paar Commits zurück gesetzt hast. Aber leider brauchst du den Codeteil, den du im zweiten Commit zurück gelassen hast. Mist. Was nun? git reflog wird wahrscheinlich ein Ergebnis der folgenden Art erzeugen:

Du siehst eine Liste von Übergaben, die Git noch in seinem Speicher hat. Die ersten 7 Zeichen sind der Anfang des SHA, gefolgt vom Commit-Pointer, der Aktion und der Nachricht. Es werden nicht nur Übergaben aufgelistet: Der Wechsel von Branches, Merges, Rebases und mehr werden angezeigt. Die wichtigen Teile sind der Pointer und der SHA-Hash. Sobald du den hast, kannst du die Änderung mit git show anzeigen oder vielleicht ein checkout, cherry-pick oder merge durchführen, abhängig davon, wie du die Änderung in deine Historie zurück haben möchtest.

Du kannst auch die --all Option für detailliertere Informationen über verschiedene Branches und sogar den Stash verwenden:

Der Befehl wird auch zu einem anderen Zweck eingesetzt: Alte Einträge löschen, die du nicht mehr benötigst. Das passiert beim Platz sparen in deinem Repository oder vielleicht weil du ab und zu den Müll rausbringen möchtest. Du kannst einzelne Reflogs mit dem delete Befehl beseitigen. Der expire Befehl ist nützlicher, da ihm ein Datum übergeben werden kann. Es gibt den Zeitpunkt an, bis wohin Einträge gelöscht werden sollen.

Ein Beispiel zum schnellen Zusammenpacken deines Repositories findet sich in John Wiegley’s Beitrag in Diving into Git, wo er sein Repository mit den folgenden Befehlen komprimiert:

$ git reflog expire --expire=1.minute refs/heads/master
$ git fsck --unreachable      
$ git prune                   
$ git gc                      

Die Befehlsabfolge entfernt alle Reflogs im Hauptzweig, die älter als eine Minute sind, findet und löscht alle Commits, die nicht mehr verwendet werden. Anschließend erfährt das gesamte Repository einen Großputz und wird weiter komprimiert. Dieser Vorgang könnte einen eigenen Beitrag vertragen, aber es ist wahrscheinlich besser, den enormen Nutzen eines Befehls in deinem Arbeitsablauf zu veranschaulichen.

Schau in der Manpage nach für weitere Optionen. Und wenn du weitere Verwendungsmöglichkeiten kennst, lass es uns wissen!