5760 Stimmen

Wie kann ich eine Datei auf eine bestimmte Revision zurücksetzen oder wiederherstellen?

Ich habe einige Änderungen an einer Datei vorgenommen, die bereits einige Male als Teil einer Gruppe von Dateien übertragen wurde, möchte nun aber die Änderungen an dieser Datei auf eine frühere Version zurücksetzen/zurücknehmen.

Ich habe eine git log zusammen mit einem git diff um die benötigte Revision zu finden, aber ich habe keine Ahnung, wie ich die Datei in ihren früheren Zustand zurückversetzen kann.

20 Stimmen

Nach dem Revertieren, nicht vergessen --cached bei der Überprüfung git diff . Link

7 Stimmen

Ich habe Ihre Frage gefunden, als ich meine gegoogelt habe. Aber nachdem ich die Lösung gelesen habe, habe ich mein Log überprüft und herausgefunden, dass ich diese Änderungen als eigenständigen Commit gemacht habe, also habe ich git revert für diesen Commit gemacht, und alles andere blieb so, wie ich es wollte. Das ist keine Lösung, sondern nur ein anderer Weg, es manchmal zu tun.

0 Stimmen

Ich verwende diese manuelle Lösung: $ git revert <commit> dann unstash gewünschte Änderungen dann hochladen diese gewünschten Änderungen in einem neuen Commit.

7746voto

Greg Hewgill Punkte 882617

Angenommen, der Hash der gewünschten Übertragung lautet c5f567 :

git checkout c5f567 -- file1/to/restore file2/to/restore

El Git-Checkout Manpage enthält weitere Informationen.

Wenn Sie zu dem Commit zurückkehren wollen, das vor c5f567 , anhängen ~1 (wobei 1 die Anzahl der Commits ist, die Sie zurückgehen wollen, das kann alles sein):

git checkout c5f567~1 -- file1/to/restore file2/to/restore

Nebenbei bemerkt, habe ich mich mit diesem Befehl immer unwohl gefühlt, weil er sowohl für gewöhnliche Dinge (Wechsel zwischen Zweigen) als auch für ungewöhnliche, destruktive Dinge (Verwerfen von Änderungen im Arbeitsverzeichnis) verwendet wird.


Außerdem gibt es eine neue git restore der speziell für die Wiederherstellung von geänderten Arbeitskopien gedacht ist. Wenn Ihr Git neu genug ist, können Sie diesen Befehl verwenden, aber die Dokumentation enthält eine Warnung:

DIESER BEFEHL IST EXPERIMENTELL. DAS VERHALTEN KANN SICH ÄNDERN.

14 Stimmen

@shadowhand: Gibt es eine Möglichkeit, das umzukehren, so dass es die Version direkt danach ist?

19 Stimmen

@aliteralmind: Nein, leider geht die Git history shortcut notation nur rückwärts in der Geschichte.

71 Stimmen

Wenn Sie einen Zweignamen für abcde (z.B.. develop ) werden Sie wollen git checkout develop -- file/to/restore (beachten Sie den doppelten Gedankenstrich)

758voto

Chris Lloyd Punkte 11502

Mit dem Befehl diff können Sie die an einer Datei vorgenommenen Änderungen schnell überprüfen:

git diff <commit hash> <filename>

Um dann eine bestimmte Datei auf diesen Commit zurückzusetzen, verwenden Sie den Befehl reset:

git reset <commit hash> <filename>

Möglicherweise müssen Sie die --hard wenn Sie lokale Änderungen haben.

Ein guter Arbeitsablauf für die Verwaltung von Wegpunkten ist die Verwendung von Tags, um Punkte in Ihrer Zeitleiste sauber zu markieren. Ich verstehe Ihren letzten Satz nicht ganz, aber vielleicht möchten Sie einen Zweig von einem früheren Zeitpunkt abzweigen. Dazu können Sie den praktischen Befehl checkout verwenden:

git checkout <commit hash>
git checkout -b <new branch name>

Wenn Sie die Änderungen zusammenführen möchten, können Sie diese dann mit dem Hauptprogramm abgleichen:

git checkout <my branch>
git rebase master
git checkout master
git merge <my branch>

9 Stimmen

Der Befehl 'git checkout <commit hash>' hat mir meine ältere Version des Projekts zurückgegeben, genau das, wonach ich gesucht habe. Danke Chris.

2 Stimmen

Git reset <commit hash> <Dateiname>' hat die Datei, die ich ändern wollte, nicht geändert. Gibt es eine Möglichkeit, nur die Version der Datei und nicht das gesamte Projekt auszuchecken?

79 Stimmen

So machen Sie die Datei rückgängig git checkout <commit hash> <filename> hat für mich besser funktioniert als git reset

434voto

foxxtrot Punkte 10954

Sie können jeden Verweis auf einen Git-Commit verwenden, auch den SHA-1, wenn das am bequemsten ist. Der Punkt ist, dass der Befehl wie folgt aussieht:

git checkout [commit-ref] -- [filename]

39 Stimmen

Worin besteht der Unterschied zwischen dieser Antwort, die -- und die akzeptierte, die das nicht tut?

108 Stimmen

In Git teilt ein ' -- ' vor der Dateiliste Git mit, dass alle weiteren Argumente als Dateinamen interpretiert werden sollen, nicht als Zweignamen oder sonstiges. Das ist manchmal ein hilfreicher Disambiguator.

67 Stimmen

Das '--' ist nicht nur eine Git-Konvention, sondern etwas, das Sie an verschiedenen Stellen in der *nix-Kommandozeile finden. rm -- -f (Entfernen Sie eine Datei namens -f ) scheint das kanonische Beispiel zu sein. Mehr Details hier

376voto

Greg Hewgill Punkte 882617
git checkout -- foo

Dadurch wird die foo zu HEAD. Sie können auch:

git checkout HEAD^ foo

für eine Revision zurück, usw.

19 Stimmen

Ich würde vorschlagen, die Syntax git checkout -- foo um Fehler zu vermeiden, wenn foo etwas Besonderes ist (wie ein Verzeichnis oder eine Datei namens -f ). Wenn Sie unsicher sind, setzen Sie bei git allen Dateien und Verzeichnissen das spezielle Argument -- .

13 Stimmen

Eine zusätzliche Anmerkung zu Mikkos Kommentar: -- ist kein Git-Befehl und nicht speziell für Git. Es handelt sich um einen Bash-Befehl, der das Ende von Befehlsoptionen anzeigt. Sie können es auch mit vielen anderen Bash-Befehlen verwenden.

23 Stimmen

@matthaeus es ist auch weder spezifisch für Bash noch eine Shell-Funktion überhaupt. Es ist eine Konvention, die in vielen verschiedenen Befehlen implementiert ist (und von getopt unterstützt wird).

188voto

mjarosie Punkte 2094

Seit git v2.23.0 gibt es eine neue Git-Wiederherstellung Methode, die einen Teil dessen übernehmen soll, was git checkout verantwortlich war (selbst in der akzeptierten Antwort wird erwähnt, dass git checkout ist ziemlich verwirrend). Siehe Höhepunkte der Änderungen auf Github-Blog .

Das Standardverhalten dieses Befehls ist die Wiederherstellung des Zustands eines Arbeitsbaums mit dem Inhalt, der aus der Datei source Parameter (der in Ihrem Fall ein Commit-Hash ist).

Basierend auf der Antwort von Greg Hewgill (unter der Annahme, dass der Commit-Hash c5f567 ) würde der Befehl wie folgt aussehen:

git restore --source=c5f567 file1/to/restore file2/to/restore

Oder wenn Sie den Inhalt einer Übertragung vor c5f567 wiederherstellen wollen:

git restore --source=c5f567~1 file1/to/restore file2/to/restore

17 Stimmen

Ich nehme an, es ist eine Art toter Faden, aber dies ist die richtige "moderne" Antwort.

0 Stimmen

Das ist die beste Antwort, danke

9 Stimmen

Dies ist die beste Antwort für das Jahr 2021.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X