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

Lesezeit: 6 Minuten

Benutzer-Avatar
Hasst_

Wie setze ich eine geänderte Datei bei einem bestimmten Commit-Hash (den ich über git log und git diff)?

  • Nach dem Zurücksetzen nicht vergessen --cached beim prüfen git diff. Verknüpfung

    – Geoffrey Hale

    2. Dezember 2015 um 19:20 Uhr


  • Ich habe deine Frage gefunden, als ich meine gegoogelt habe. Aber nachdem ich die Lösung gelesen hatte, überprüfte ich mein Protokoll und fand heraus, dass ich die Änderungen als eigenständiges Commit vorgenommen hatte, also machte ich git revert für dieses Commit, und alles andere blieb so, wie ich es wollte. Keine Lösung, nur eine andere Möglichkeit, es manchmal zu tun.

    – sudo97

    8. August 2017 um 14:08 Uhr

  • Ich verwende diese manuelle Lösung: $ git revert , entstash dann die gewünschten Änderungen und lade dann diese gewünschten Änderungen in einen neuen Commit hoch.

    – Absicht

    14. Juli 2021 um 18:19 Uhr

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

git diff <commit hash> <filename>

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

git reset <commit hash> <filename>

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

Ein guter Arbeitsablauf zum Verwalten von Wegpunkten besteht darin, Tags zu verwenden, um Punkte in Ihrer Zeitachse sauber zu markieren. Ich kann Ihren letzten Satz nicht ganz verstehen, aber was Sie vielleicht wollen, ist, einen Zweig von einem früheren Zeitpunkt abzuzweigen. Verwenden Sie dazu den praktischen Checkout-Befehl:

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

Sie können dies dann mit Ihrer Hauptlinie rebasieren, wenn Sie bereit sind, diese Änderungen zusammenzuführen:

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

  • Der Befehl ‘git checkout ‘ hat mir meine ältere Version des Projekts zurückgegeben, genau das, wonach ich gesucht habe. Danke, Chris.

    – vidur punj

    27. Januar 2013 um 9:26 Uhr


  • Um die Datei zurückzusetzen git checkout <commit hash> <filename> funktionierte besser für mich als git reset

    – Motti Strom

    7. März 2013 um 16:53 Uhr


  • Ich wollte eine frühe Version einer einzelnen Datei, weil ich 150 Zeilen mit einem schlecht gewählten Copy/Paste überschrieben hatte. git checkout <commit hash> <filename> hat bei mir funktioniert. Dies sollte meiner Meinung nach nicht die akzeptierte Antwort sein. git reset nicht.

    – Harperville

    27. Februar 2014 um 20:58 Uhr

  • Kann ich nicht benutzen git reset Um eine einzelne Datei zurückzusetzen, erhalten Sie eine Fehlermeldung fatal: Cannot do hard reset with paths

    – schleichender

    23. Dezember 2014 um 17:11 Uhr


  • Was Slier sagte: Sie können nicht git reset --hard <commit hash> <filename>. Dies wird Fehler mit fatal: Cannot do hard reset with paths. Was Motti Strom sagte: verwenden git checkout <commit hash> <filename>

    – Hawkeye Parker

    6. Februar 2015 um 5:36 Uhr

  • Was ist der Unterschied zwischen dieser Antwort, die hat --und die akzeptierte, die nicht?

    – 2rs2ts

    9. Oktober 2014 um 0:20 Uhr

  • In Git teilt ein ‘ — ‘ vor der Dateiliste Git mit, dass alle nächsten Argumente als Dateinamen interpretiert werden sollen, nicht als Zweignamen oder irgendetwas anderes. Es ist manchmal ein hilfreicher Disambiguator.

    – Foxxtrott

    9. Oktober 2014 um 14:32 Uhr

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

    – Hawkeye Parker

    6. Februar 2015 um 5:49 Uhr

  • Fügen Sie einfach hinzu, was @HawkeyeParker gesagt hat: rm Der Befehl verwendet getopt(3), um seine Argumente zu parsen. getopt ist der Befehl zum Analysieren von Befehlsargumenten. gnu.org/software/libc/manual/html_node/Getopt.html

    – Devy

    14. Juli 2015 um 18:11 Uhr

  • @Honey Ja, das meine ich, und ja, wahrscheinlich überhaupt nicht üblich. Ich habe dieses Beispiel an verschiedenen Stellen gesehen, vielleicht nur, um es einprägsam zu machen: rm -f ist bekannt dafür, beängstigend/gefährlich zu sein. Aber, der Punkt ist, in *nix ein Dateiname kann Beginnen Sie mit einem ‘-‘, und dies wird verschiedene Befehlszeileninterpreter verwirren, die, wenn sie ein ‘-‘ sehen, erwarten, dass eine Befehlsoption folgt. Es kann jede Datei sein, die mit ‘-‘ beginnt; zB “-mySpecialFile”.

    – Hawkeye Parker

    5. April 2017 um 20:35 Uhr

Benutzer-Avatar
Greg Hewgill

git checkout -- foo

Das wird zurückgesetzt foo zu KOPF. Du kannst auch:

git checkout HEAD^ foo

für eine Überarbeitung zurück usw.

  • Ich würde vorschlagen, Syntax zu verwenden git checkout -- foo um Fehler zu vermeiden, wenn foo etwas Besonderes ist (wie ein Verzeichnis oder eine Datei namens -f). Wenn Sie sich nicht sicher sind, stellen Sie bei git allen Dateien und Verzeichnissen immer das spezielle Argument voran --.

    – Mikko Rantalainen

    18. März 2013 um 7:22 Uhr

  • Eine zusätzliche Anmerkung zu Mikkos Kommentar: -- ist kein Git-Befehl und nichts Besonderes für Git. Es ist eine eingebaute Bash, um das Ende der Befehlsoptionen anzuzeigen. Sie können es auch mit vielen anderen Bash-Befehlen verwenden.

    – Matthäus

    4. März 2016 um 13:04 Uhr

  • @matthaeus es ist auch weder bash-spezifisch noch überhaupt ein Shell-Feature. Es ist eine Konvention, die in vielen verschiedenen Befehlen implementiert ist (und von getopt unterstützt wird).

    – Greg Hewgill

    4. März 2016 um 17:47 Uhr

  • Nein, -- ist nicht ein eingebautes spezielles Wort in bash. Aber es ist eine gängige Konvention, die von vielen Befehlszeilen-Parsern unterstützt und von vielen CLIs verwendet wird, einschließlich git.

    – Emil Lundberg

    1. September 2019 um 14:20 Uhr

Benutzer-Avatar
CDR

Und um zur letzten festgeschriebenen Version zurückzukehren, was am häufigsten benötigt wird, können Sie diesen einfacheren Befehl verwenden.

git checkout HEAD file/to/restore

  • Ich würde vorschlagen, Syntax zu verwenden git checkout -- foo um Fehler zu vermeiden, wenn foo etwas Besonderes ist (wie ein Verzeichnis oder eine Datei namens -f). Wenn Sie sich nicht sicher sind, stellen Sie bei git allen Dateien und Verzeichnissen immer das spezielle Argument voran --.

    – Mikko Rantalainen

    18. März 2013 um 7:22 Uhr

  • Eine zusätzliche Anmerkung zu Mikkos Kommentar: -- ist kein Git-Befehl und nichts Besonderes für Git. Es ist eine eingebaute Bash, um das Ende der Befehlsoptionen anzuzeigen. Sie können es auch mit vielen anderen Bash-Befehlen verwenden.

    – Matthäus

    4. März 2016 um 13:04 Uhr

  • @matthaeus es ist auch weder bash-spezifisch noch überhaupt ein Shell-Feature. Es ist eine Konvention, die in vielen verschiedenen Befehlen implementiert ist (und von getopt unterstützt wird).

    – Greg Hewgill

    4. März 2016 um 17:47 Uhr

  • Nein, -- ist nicht ein eingebautes spezielles Wort in bash. Aber es ist eine gängige Konvention, die von vielen Befehlszeilen-Parsern unterstützt und von vielen CLIs verwendet wird, einschließlich git.

    – Emil Lundberg

    1. September 2019 um 14:20 Uhr

Benutzer-Avatar
Gemeinschaft

Ich hatte gerade das gleiche Problem und fand diese Antwort am einfachsten zu verstehen (commit-ref ist der SHA-Wert der Änderung im Protokoll, zu dem Sie zurückkehren möchten):

git checkout [commit-ref] [filename]

Dadurch wird diese alte Version in Ihrem Arbeitsverzeichnis abgelegt und Sie können sie von dort aus übertragen, wenn Sie möchten.

1331800cookie-checkWie kann ich eine Datei auf eine bestimmte Revision zurücksetzen oder wiederherstellen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy