Wie kann man ein ganzes Verzeichnis aus dem Verlauf des Git-Repositorys wiederherstellen?

89

Ich möchte ein ganzes Verzeichnis (rekursiv) aus dem Verlauf meines Git-Repositorys wiederherstellen.

Es gibt nur 1 Zweig (Master).

Ich kenne das Commit, bei dem Fehler enthalten waren.

Kann ich den sha1-Hash des übergeordneten Commits verwenden, um den Status des Verzeichnisses wiederherzustellen, wie er war, bevor die Fehler aufgenommen wurden?

Ich dachte über so etwas nach:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 path/to/the/folder/

aber es hat nicht funktioniert.

meistgesucht
quelle
7
Versuchen Sie, '-' zwischen Revisionen und Pfaden git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/
hinzuzufügen
das hat geholfen. vielen Dank.
Mostwanted
1
@ CarlosCampderrós Schreiben Sie das als echte Antwort und sammeln Sie Ihre 15 Punkte, bevor es jemand anderes tut;)
ralphtheninja
@MagnusSkog Ich war mir nicht sicher, ob das funktionieren würde, also habe ich einen Kommentar abgegeben, nur um das zu überprüfen. Jetzt, da ich sicher bin, dass es funktioniert, habe ich es als Antwort aufgeschrieben :)
Carlos Campderrós
2
Als allgemeiner Hinweis ist "es hat nicht funktioniert" nicht sehr nützlich. Sagen Sie uns, warum es nicht funktioniert hat, idealerweise mit der Fehlerausgabe (abgeschnitten, wenn es sehr lang ist).
me_and

Antworten:

153

Versuchen Sie, '-' zwischen Revisionen und Pfaden hinzuzufügen:

git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/ 

Wenn Sie ein Verzeichnis aus dem vorherigen Commit wiederherstellen möchten, können Sie den Commit-Hash durch HEAD ~ 1 ersetzen, zum Beispiel:

git checkout HEAD~1 -- path/to/the/folder/ 
Carlos Campderrós
quelle
gleicher Befehl, fast anderer Zweck: stackoverflow.com/questions/953481/…
cregox
18
Es gibt jedoch ein Problem: Das OP gibt nicht an, ob das Verzeichnis noch vorhanden ist. Um ein vorhandenes Verzeichnis auf den Status eines Commits zurückzusetzen, sollte zuerst der Inhalt des Verzeichnisses gelöscht werden. In anderen Fällen werden vorhandene Dateien, die im alten Commit nicht vorhanden waren, nicht entfernt.
Alberto
7
+1 @Alberto stimme definitiv zu. Ich habe ein rm -Rf path/to/the/folderdamaliges git checkout 348ce0aa02d3738e55ac9085080028b548e3d8d3 -- path/to/the/folder/Ergebnis gemacht: Dieser Pfad hatte genau die gleichen Dateien wie in diesem Commit, keine Unterschiede und keine zusätzlichen Dateien, die nach diesem Commit erstellt wurden. Welches ist was ich will.
Therobyouknow
2
Was bedeutet das --tun?
Ray Foss
2
@RayFoss teilt git mit, dass die folgenden Parameter Dateien sind (andernfalls könnten sie mit einem Commit-Hash, einer Verzweigung oder etwas anderem verwechselt werden). Normalerweise werden sie nicht benötigt, aber es tut nicht weh, sie zu setzen
Carlos Campderrós
2

Es gibt zwei einfache Möglichkeiten, dies zu tun:

Wenn das Commit, das die Fehler enthielt, nur die Fehler enthielt, verwenden Sie git revert, um die Auswirkungen umzukehren.

Wenn nicht, ist der einfache Weg folgender:

  1. git checkout 348…
  2. cp -a path/to/the/folder ../tmp-restore-folder
  3. git checkout HEAD # or whatever
  4. rm -rf path/to/the/folder
  5. mv ../tmp-restore-folder path/to/the/folder
  6. git add path/to/the/folder
  7. git commit -m "revert …"
Daniel Pittman
quelle
1

Wenn Sie dies einfach tun git checkout <SHA-ID>, werden Sie vorübergehend zu diesem Sha-Commit versetzt.

Jedes Festschreibungsobjekt enthält zu diesem Zeitpunkt die gesamte Struktur der Festplatte. Wenn Sie also Dateien dort haben und diese kopieren müssen, können Sie dies tun. Achtung, Sie befinden sich nicht in einem Zweig, daher müssen Sie zum Master zurückkehren, bevor Sie die Datei in Ihren Arbeitsbaum kopieren und festschreiben.

Mark Fisher
quelle
re "gehe zurück zum Master" meinst du Checkout Master?
Pacerier