HOWTO · Git
Zurücksetzen einer Datei auf einen vorherigen Commit in Git
Erfahren Sie, wie Sie eine versionierte Datei mit git restore oder git checkout aus einem früheren Git-Commit wiederherstellen, das Ergebnis prüfen und entscheiden, ob Sie sie stagen und committen.
Auf dieser Seite
Um eine einzelne versionierte Datei aus einem früheren Commit wiederherzustellen, suchen Sie den Commit mit der gewünschten Version und führen Sie anschließend git restore --source <commit> -- <file-path> aus. Dadurch wird die Datei im Arbeitsverzeichnis aktualisiert, ohne die Commit-Historie zu ändern; standardmäßig bleibt die wiederhergestellte Version unstaged. Prüfen oder sichern Sie vorher wichtige lokale Änderungen: Beim Wiederherstellen wird der Dateiinhalt in Ihrem Arbeitsverzeichnis ersetzt. Wenn Sie die wiederhergestellte Version in einem neuen Commit festhalten möchten, stagen und committen Sie sie anschließend.
Den Commit mit der gewünschten Version finden
Mit git log --oneline -- <file-path> sehen Sie, welche Commits die Datei geändert haben, und können den Commit mit der gewünschten Version ermitteln. Für eine README.md im Repository-Stamm führen Sie zum Beispiel git log --oneline -- README.md aus. -- kennzeichnet das Ende der Befehlsoptionen; das ist hilfreich, wenn ein Pfad sonst als Option interpretiert werden könnte. Bei git log kann ein Pfad relativ zu Ihrem aktuellen Verzeichnis sein. Sie können auch einen Pfad relativ zum Repository-Stamm mit der Git-Pfadsyntax :(top) verwenden, zum Beispiel :(top)README.md.
Lesen Sie die Commit-Zusammenfassung und prüfen Sie bei Bedarf den Dateiinhalt in einem möglichen Commit mit git show <commit>:<file-path>. Bei dieser Schreibweise ist der Pfad nach dem Doppelpunkt immer relativ zum Repository-Stamm, unabhängig von Ihrem aktuellen Verzeichnis. Wenn Sie beispielsweise aus einem Unterverzeichnis docs mit git log --oneline -- README.md Änderungen an docs/README.md gesucht haben, prüfen Sie diese Version mit git show <commit>:docs/README.md. Für eine README.md im Repository-Stamm verwenden Sie git show <commit>:README.md, sowohl vom Stammverzeichnis als auch von einem Unterverzeichnis aus. Verwenden Sie im Restore-Befehl die in der Protokollausgabe angezeigte Commit-ID, abgekürzt oder vollständig. Auch ein älterer Commit kann die gewünschte Version enthalten, selbst wenn spätere Commits dieselbe Datei geändert haben. Entscheiden Sie anhand des Datei-Inhalts, den Sie zurückholen möchten, und nicht einfach anhand des neuesten Eintrags.
Eine Datei aus einem früheren Commit wiederherstellen
Prüfen oder sichern Sie zunächst wichtige Änderungen an der Zieldatei. Stellen Sie dann die ausgewählte Version mit git restore --source <commit> -- <file-path> wieder her. Für das vorgegebene Beispiel lautet der Befehl git restore --source 9cbe84d -- README.md. Ersetzen Sie Commit und Pfad durch die Werte aus Ihrem Repository. Der Befehl kopiert die in diesem Commit gespeicherte Dateiversion in Ihr Arbeitsverzeichnis. Er erstellt keinen Commit und verschiebt den aktuellen Branch nicht; standardmäßig werden die wiederhergestellten Inhalte nicht gestaged.
Die Befehlsbeispiele zeigen Git-Operationen und enthalten keine behauptete Laufzeitausgabe. Ihre Wirkung hängt von der Historie Ihres Repositorys sowie dem aktuellen Zustand von Index und Arbeitsverzeichnis ab. Prüfen Sie nach dem Wiederherstellen die Änderung im Arbeitsverzeichnis mit git diff -- <file-path>. Falls für diesen Pfad bereits Änderungen gestaged sind, sehen Sie sich die vorgemerkte Version mit git diff --cached -- <file-path> an, damit klar ist, was in den nächsten Commit aufgenommen wird.
Zwischen git restore und git checkout wählen
Für eine Datei aus einem ausgewählten Commit macht git restore --source <commit> -- <file-path> den Quell-Commit ausdrücklich kenntlich und aktualisiert standardmäßig das Arbeitsverzeichnis, ohne das Ergebnis zu stagen. Die Alternative in Pfadform lautet git checkout <commit> -- <file-path>. Diese Form aktualisiert sowohl die Datei im Arbeitsverzeichnis als auch den Index; die wiederhergestellte Version ist damit sofort gestaged. Das ist wichtig, wenn Sie einen Commit vorbereiten: Prüfen Sie nach git checkout die vorgemerkte Änderung. Nach git restore stagen Sie die Datei selbst, wenn Sie das beabsichtigen.
Beide Formen ersetzen den aktuellen Inhalt der Zieldatei im Arbeitsverzeichnis. Sichern oder prüfen Sie lokale Änderungen, bevor Sie einen der Befehle ausführen, insbesondere wenn diese Änderungen nicht anderweitig committet wurden. Das Wiederherstellen einer Datei erstellt keinen Commit; es ändert den Zustand, von dem aus Sie weiterarbeiten können. Die Branch-Historie bleibt unverändert, bis Sie später einen Commit erstellen.
Die wiederhergestellte Datei stagen und committen
Prüfen Sie nach git restore die Änderung und stagen Sie die Datei mit git add -- <file-path>, wenn sie in einen Commit aufgenommen werden soll. Kontrollieren Sie anschließend mit git diff --cached -- <file-path> die vorgemerkte Version und erstellen Sie einen Commit mit einer Nachricht, die den Grund für das Wiederherstellen beschreibt. Möchten Sie die Wiederherstellung noch nicht festhalten, lassen Sie die Änderung im Arbeitsverzeichnis.
Nach git checkout <commit> -- <file-path> in Pfadform befindet sich die wiederhergestellte Version bereits im Index. Prüfen Sie sie vor dem Commit mit git diff --cached -- <file-path>. Je nachdem, was Sie als Nächstes tun möchten, können Sie die Datei weiter bearbeiten, diese Änderungen stagen oder den Pfad aus dem Index entfernen und dabei den Dateiinhalt im Arbeitsverzeichnis beibehalten. Ob Sie die wiederhergestellte Datei committen, ist eine separate Entscheidung; die Wiederherstellung veröffentlicht oder teilt die Änderung nicht automatisch.
git revert und git reset bei Dateien verstehen
git revert und das Wiederherstellen einer Datei lösen unterschiedliche Aufgaben. git revert <commit> erstellt einen neuen Commit, der die Änderungen eines früheren Commits rückgängig macht. So wird ein Commit zurückgenommen, während die bestehende Historie erhalten bleibt. Der Befehl kopiert keine einzelne Datei aus einem früheren Commit. Um eine einzelne Dateiversion zurückzuholen, verwenden Sie den oben beschriebenen Ablauf mit dem Quell-Commit und entscheiden Sie anschließend, ob Sie das Ergebnis committen möchten.
git reset HEAD -- <file-path> in Pfadform entfernt den Pfad aus dem Index: Es passt den Index an HEAD an und lässt den Dateiinhalt im Arbeitsverzeichnis unverändert. Der Befehl stellt keine Dateiinhalte aus einem ausgewählten Commit wieder her. Um Änderungen im Arbeitsverzeichnis zu verwerfen und eine Datei auf die aktuelle Version von HEAD zurückzusetzen, stellt git restore -- <file-path> standardmäßig die Version aus HEAD wieder her. Dabei wird ebenfalls der Inhalt im Arbeitsverzeichnis ersetzt; prüfen oder sichern Sie Änderungen daher vorher. Die ältere Pfadform git checkout -- <file-path> hat einen ähnlichen Verwerfungseffekt, wählt aber keinen früheren Commit aus. Verwenden Sie die ausdrückliche Form --source <commit>, wenn die Zielversion aus einem bestimmten Commit stammt.
Weitere Informationen finden Sie in der Git-Dokumentation zu restore, der Git-Dokumentation zu checkout und im Pro-Git-Kapitel über das Rückgängigmachen von Änderungen.