Wie setze ich eine geänderte Datei bei einem bestimmten Commit-Hash (den ich über git log
und git diff
)?
Wie kann ich eine Datei auf eine bestimmte Revision zurücksetzen oder wiederherstellen?
Hasst_
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 alsgit 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 Fehlermeldungfatal: 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 mitfatal: Cannot do hard reset with paths.
Was Motti Strom sagte: verwendengit 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
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, wennfoo
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
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, wennfoo
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
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.
Nach dem Zurücksetzen nicht vergessen
--cached
beim prüfengit 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