git ready

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

Ein Verzeichnis aus der Historie wiederherstellen

eingetragen am 18 Mar 2009

Es ist ziemlich einfach eine einzelne Datei aus der Historie zurückzurollen oder wiederherzustellen. Aber wie wird ein gesamtes Verzeichnis aus der Historie wiederhergestellt?

Die Lösung ist einfach:

git checkout <treeish> -- /path/to/dir

Dieser Befehl wird das Verzeichnis /path/to/dir aus dem angegebenen “treeish” wiederherstellen. Wir gehen durch ein entsprechendes Beispiel:

Zunächst entfernen wir ein Verzeichnis und führen dann eine ganze Menge von Änderungen zusammen (zur künftigen Referenz, das Beispiel stammt aus einem Refactoring-Zweig von Jekyll, die statische Blog-Engine für diese Seite).

Die Historie sieht dann so aus:

Das ist hoffentlich nicht zu verwirrend. Der Commit von eben ist vom Prinzip her ziemlich weit unten in der Historie und das entspricht meistens auch der Realität, wenn ein Verzeichnis wiederhergestellt werden soll. Als Erstes benötigen wir die Referenz des Commits, der das gewünschte Verzeichnis enthält. In unserem Fall ist bekannt, dass der letzte Commit der Merge war und im Commit vorher wurde das Verzeichnis gelöscht. Also ist der zu referenzierende Commit der dritte in der Historie, oder HEAD~2. Man könnte den Commit auch mit dem Branch-Namen referenzieren (test~2) oder sogar auf den SHA der Löschung zurück gehen (f46666d^).

Wenn versucht wird, ein Verzeichnis aus einer Revision herauszuholen, das dort nicht existiert, kommt in jedem Fall diese nette Nachricht:

$ git checkout test~1 -- bin/
error: pathspec 'bin' did not match any file(s) known to git.

Wird die richtige Revision verwendet, kommt auch das Verzeichnis zurück, wo es hingehört:

Großartig, nun sind wir wieder im Geschäft. Von hier kann man Dateien oder das Verzeichnis wie gewünscht hinzufügen und einchecken.

In dieser Situation kommt eventuell auch das Zurückrollen (Revert) das Commits in Frage, das ebenso gelöschte Dateien wiederherstellt. Das ist jedoch nicht immer möglich und muss nicht der beste Weg sein, ein vermisstes Verzeichnis aus der Historie zurückzuholen.