Ich habe einige Änderungen an einer Datei vorgenommen, die einige Male als Teil einer Gruppe von Dateien festgeschrieben wurde, möchte aber jetzt die Änderungen daran zurücksetzen / auf eine frühere Version zurücksetzen.
Ich habe git log
zusammen mit a git diff
die Revision gefunden, die ich benötige, habe aber keine Ahnung, wie ich die Datei in den früheren Zustand zurückversetzen kann.
git
version-control
git-checkout
Hates_
quelle
quelle
--cached
beim Überprüfen nichtgit diff
. LinkAntworten:
Angenommen, der Hash des gewünschten Commits lautet
c5f567
:Die git checkout Manpage gibt weitere Informationen.
Wenn Sie zuvor zum Commit zurückkehren möchten
c5f567
, hängen Sie an~1
(wobei 1 die Anzahl der Commits ist, die Sie zurückgehen möchten, kann dies alles sein):Nebenbei bemerkt, ich habe 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.
quelle
develop
möchten (z. B. ), möchten Siegit checkout develop -- file/to/restore
(beachten Sie den doppelten Strich)Mit dem Befehl diff können Sie die an einer Datei vorgenommenen Änderungen schnell überprüfen:
Verwenden Sie dann den Befehl reset, um eine bestimmte Datei auf dieses Commit zurückzusetzen:
Möglicherweise müssen Sie die
--hard
Option verwenden, wenn Sie lokale Änderungen vorgenommen haben.Ein guter Workflow für die Verwaltung von Wegpunkten besteht darin, Tags zu verwenden, um Punkte in Ihrer Zeitleiste sauber zu markieren. Ich kann Ihren letzten Satz nicht ganz verstehen, aber Sie möchten vielleicht einen Zweig von einem früheren Zeitpunkt abweichen. Verwenden Sie dazu den praktischen Checkout-Befehl:
Sie können dies dann für Ihre Hauptlinie neu festlegen, wenn Sie bereit sind, diese Änderungen zusammenzuführen:
quelle
git checkout <commit hash> <filename>
funktionierte besser für mich alsgit reset
git checkout <commit hash> <filename>
arbeitete für mich. Dies sollte meiner Meinung nach nicht die akzeptierte Antwort sein.git reset
nicht.git reset
, um einzelne Datei zurückzusetzen, erhalten Sie eine Fehlerfatal: Cannot do hard reset with paths
git reset --hard <commit hash> <filename>
. Dies wird Fehler mit dem,fatal: Cannot do hard reset with paths.
was Motti Strom sagte: Verwenden Siegit checkout <commit hash> <filename>
Sie können jeden Verweis auf ein Git-Commit verwenden, einschließlich des SHA-1, wenn dies am bequemsten ist. Der Punkt ist, dass der Befehl so aussieht:
git checkout [commit-ref] -- [filename]
quelle
--
, und der akzeptierten, die nicht hat?rm -- -f
(Entfernen Sie eine Datei mit dem Namen-f
) scheint das kanonische Beispiel zu sein. Weitere Details hierrm
Befehl verwendet getopt (3), um seine Argumente zu analysieren.getopt
ist der Befehl zum Parsen von Befehlsargumenten. gnu.org/software/libc/manual/html_node/Getopt.htmlDas wird
foo
auf HEAD zurückgesetzt. Du kannst auch:für eine Revision zurück usw.
quelle
git checkout -- foo
zu verwenden, um Fehler zu vermeiden, wennfoo
etwas Besonderes ist (wie ein Verzeichnis oder eine aufgerufene Datei-f
). Wenn Sie sich bei git nicht sicher sind, stellen Sie allen Dateien und Verzeichnissen immer das spezielle Argument voran--
.--
ist kein Git-Befehl und nichts Besonderes für Git. Es ist eine integrierte Bash, um das Ende der Befehlsoptionen anzuzeigen. Sie können es auch mit vielen anderen Bash-Befehlen verwenden.--
ist kein eingebautes spezielles Wort in Bash. Es ist jedoch eine gängige Konvention, die von vielen Befehlszeilenparsern unterstützt und von vielen CLIs, einschließlich git, verwendet wird.Um zur zuletzt festgeschriebenen Version zurückzukehren, die am häufigsten benötigt wird, können Sie diesen einfacheren Befehl verwenden.
quelle
Ich hatte gerade das gleiche Problem und fand diese Antwort am einfachsten zu verstehen (
commit-ref
ist der SHA-Wert der Änderung in dem Protokoll, zu dem Sie zurückkehren möchten):Dadurch wird diese alte Version in Ihr Arbeitsverzeichnis aufgenommen und von dort aus können Sie sie festschreiben, wenn Sie möchten.
quelle
Wenn Sie wissen, wie viele Commits Sie benötigen, um zurückzukehren, können Sie Folgendes verwenden:
Dies setzt voraus, dass Sie sich in der
master
Verzweigung befinden und die gewünschte Version 5 Commits zurück ist.quelle
Ich glaube, ich habe es gefunden ... von http://www-cs-students.stanford.edu/~blynn/gitmagic/ch02.html
Manchmal möchte man einfach zurückgehen und jede Änderung nach einem bestimmten Punkt vergessen, weil sie alle falsch sind.
Beginnen mit:
$ git log
Hier sehen Sie eine Liste der letzten Commits und deren SHA1-Hashes.
Geben Sie als Nächstes Folgendes ein:
$ git reset --hard SHA1_HASH
um den Status eines bestimmten Commits wiederherzustellen und alle neueren Commits dauerhaft aus dem Datensatz zu löschen.
quelle
git push --force
Das hat bei mir funktioniert:
Übernehmen Sie dann die Änderung:
quelle
Sie müssen vorsichtig sein, wenn Sie "Rollback" sagen. Wenn Sie früher eine Version einer Datei in Commit $ A hatten und später zwei Änderungen in zwei separaten Commits $ B und $ C vorgenommen haben (was Sie also sehen, ist die dritte Iteration der Datei), und wenn Sie sagen " Ich möchte zum ersten zurückkehren ", meinst du das wirklich so?
Wenn Sie die Änderungen sowohl bei der zweiten als auch bei der dritten Iteration entfernen möchten, ist dies ganz einfach:
und dann legen Sie das Ergebnis fest. Der Befehl fragt "Ich möchte die Datei aus dem Status auschecken, der vom Commit $ A aufgezeichnet wurde".
Auf der anderen Seite wollten Sie die Änderung entfernen, die durch die zweite Iteration (dh Commit $ B) eingeführt wurde, und dabei beibehalten, was Commit $ C für die Datei getan hat. Sie möchten $ B zurücksetzen
Beachten Sie, dass wer auch immer $ B begehen nicht erstellt haben sehr diszipliniert und völlig unabhängig Änderung begangen haben , können in der gleichen begehen, und diese revert andere Dateien als berühren Datei Sie Änderungen sehen zu verletzen, so dass Sie das Ergebnis sorgfältig nach dem Handeln überprüfen möchten damit.
quelle
Amüsanterweise funktioniert
git checkout foo
es nicht, wenn sich die Arbeitskopie in einem Verzeichnis mit dem Namen befindetfoo
. jedoch beidesgit checkout HEAD foo
undgit checkout ./foo
wird:quelle
git checkout -- foo
So
rebase
funktioniert es:Angenommen, Sie haben
Die ersten beiden Befehle ... Commit Git Checkout Git Rebase Master
... überprüfen Sie den Zweig der Änderungen, die Sie auf den
master
Zweig anwenden möchten . Derrebase
Befehl nimmt die Commits von<my branch>
(die nicht in gefunden werdenmaster
) und wendet sie erneut auf den Kopf von anmaster
. Mit anderen Worten, das übergeordnete Element des ersten Commits in<my branch>
ist kein vorheriges Commit mehr in dermaster
Historie, sondern der aktuelle Leiter vonmaster
. Die beiden Befehle sind dieselben wie:Es ist möglicherweise einfacher, sich an diesen Befehl zu erinnern, da sowohl die Zweige "base" als auch "modify" explizit sind.
. Das endgültige Ergebnis der Geschichte ist:
Die letzten beiden Befehle ...
... führen Sie eine Schnellvorlaufzusammenführung durch, um alle
<my branch>
Änderungen zu übernehmenmaster
. Ohne diesen Schritt wird das Rebase-Commit nicht hinzugefügtmaster
. Das Endergebnis ist:master
und<my branch>
beide ReferenzB'
. Ab diesem Punkt ist es auch sicher, die<my branch>
Referenz zu löschen .quelle
Ab Git v2.23.0 gibt es eine neue Git-Wiederherstellungsmethode , die einen Teil dessen übernehmen soll, wofür
git checkout
verantwortlich war (selbst die akzeptierte Antwort erwähnt, dass diesgit checkout
ziemlich verwirrend ist). Die Höhepunkte der Änderungen finden Sie im Github-Blog .Das Standardverhalten dieses Befehls besteht darin, den Status eines Arbeitsbaums mit dem Inhalt wiederherzustellen, der aus dem
source
Parameter stammt (in Ihrem Fall ein Commit-Hash).Basierend auf Greg Hewgills Antwort (vorausgesetzt, der Commit-Hash ist
c5f567
) würde der Befehl folgendermaßen aussehen:Oder wenn Sie den Inhalt eines Commits vor c5f567 wiederherstellen möchten:
quelle
Erster Kopf für Zieldatei zurücksetzen
Zweiter Checkout dieser Datei
quelle
wo
<N>
ist die Anzahl der Revisionen der Datei zu Rollbacks für Datei<filename>
. FührenSie beispielsweise aus, um die sofortige vorherige Revision einer einzelnen Datei
x/y/z.c
auszucheckenWie funktioniert Git Prevision?
Fügen Sie Folgendes zu Ihrem hinzu
gitconfig
Im Wesentlichen alles, was man in dieser Situation manuell tun würde,
zusammengefasst in einem schönen, effizienten Git-Alias - Git-Prevision
quelle
Ich muss hier EasyGit einstecken , ein Wrapper, um Git für Anfänger zugänglicher zu machen, ohne erfahrene Benutzer zu verwirren. Eines der Dinge, die es tut, ist , mehr Bedeutungen zu geben
git revert
. In diesem Fall würden Sie einfach sagen:eg revert foo/bar foo/baz
quelle
eg revert --in REVISON -- FILENAME
. Das--in
ist wichtig. Für die Windows-Benutzer da draußen: Öffnen Sie Git Bash. Ausführenecho %PATH
. Der erste Pfad sollte sich in Ihrem Benutzerverzeichnis befinden und mit endenbin
. Erstellen Sie diesen Pfad. Speichern Sie zB dort. Nennen Sie eseg
. Nichteg.txt
.Für den Fall, dass Sie eine Datei auf ein vorheriges Commit zurücksetzen möchten (und die Datei, die Sie bereits festgeschrieben zurücksetzen möchten), können Sie verwenden
oder
Dann einfach inszenieren und die "neue" Version festschreiben.
Mit dem Wissen, dass ein Commit im Falle einer Zusammenführung zwei Eltern haben kann, sollten Sie wissen, dass HEAD ^ 1 der erste Elternteil und HEAD ~ 1 der zweite Elternteil ist.
Beides funktioniert, wenn nur ein Elternteil im Baum vorhanden ist.
quelle
Viele Vorschläge hier, meistens in Anlehnung an
git checkout $revision -- $file
. Ein paar obskure Alternativen:Außerdem benutze ich dies häufig, um vorübergehend eine bestimmte Version zu sehen:
oder
(OBS:
$file
muss vorangestellt werden,./
wenn es sich um einen relativengit show $revision:$file
Arbeitspfad handelt)Und umso seltsamer:
quelle
Beachten Sie jedoch, dass
git checkout ./foo
undgit checkout HEAD ./foo
nicht genau dasselbe sind; Beispiel:(Die zweite
add
Stufe der Datei im Index wird jedoch nicht festgeschrieben.)Git checkout ./foo
bedeutet, den Pfad./foo
vom Index zurückzusetzen ; Durch das Hinzufügen wirdHEAD
Git angewiesen, diesen Pfad im Index auf seineHEAD
Revision zurückzusetzen, bevor Sie dies tun.quelle
Für mich schien keine der Antworten wirklich klar zu sein und deshalb möchte ich meine hinzufügen, was super einfach erscheint.
Ich habe ein Commit
abc1
und danach habe ich mehrere (oder eine Änderung) an einer Datei vorgenommenfile.txt
.Sagen Sie jetzt, dass ich etwas in der Datei durcheinander gebracht habe
file.txt
und zu einem vorherigen Commit zurückkehren möchteabc1
.1 .
git checkout file.txt
: Dadurch werden lokale Änderungen entfernt, wenn Sie sie nicht benötigen2 .
git checkout abc1 file.txt
: Dadurch wird Ihre Datei auf die gewünschte Version gebracht3 .
git commit -m "Restored file.txt to version abc1"
: Dies wird Ihre Umkehrung begehen.git push
: Dadurch wird alles auf das Remote-Repository übertragenNatürlich können Sie zwischen Schritt 2 und 3
git status
verstehen, was los ist. Normalerweise sollte dasfile.txt
bereits hinzugefügte angezeigt werden, weshalb kein a erforderlich istgit add
.quelle
2.Git Datei auf einen bestimmten Zweig zurücksetzen
quelle
Um zu einer früheren Festschreibungsversion der Datei zu gelangen, rufen Sie die Festschreibungsnummer ab, z. B. eb917a1
Wenn Sie nur zur letzten festgeschriebenen Version zurückkehren müssen
Dadurch gelangen Sie einfach zum letzten festgeschriebenen Status der Datei
quelle
git checkout ref | commitHash - filePath
z.B
quelle
Viele Antworten hier behaupten, sie zu verwenden,
git reset ... <file>
odergit checkout ... <file>
wenn Sie dies tun, verlieren Sie alle Änderungen an<file>
Commit nach dem Commit, das Sie zurücksetzen möchten.Wenn Sie Änderungen von einem Commit nur für eine einzelne Datei rückgängig machen möchten, genau wie
git revert
für eine Datei (oder eine Teilmenge der Commit-Dateien), empfehle ich, beidegit diff
undgit apply
ähnliche Elemente zu verwenden (mit<sha>
= dem Hash des Commit, das Sie zurücksetzen möchten):Grundsätzlich wird zuerst ein Patch generiert, der den Änderungen entspricht, die Sie rückgängig machen möchten, und dann der Patch erneut angewendet, um diese Änderungen zu löschen.
Natürlich funktioniert es nicht, wenn zurückgesetzte Zeilen durch ein Commit zwischen
<sha1>
undHEAD
(Konflikt) geändert wurden .quelle
git show -p <sha> path/to/file.ext|git apply -R
<sha>^!
anstelle von<sha>^ <sha>
Verwenden Sie
git log
diese Option , um den Hash-Schlüssel für eine bestimmte Version abzurufen, und verwenden Sie ihn danngit checkout <hashkey>
Hinweis: Vergessen Sie nicht, den Hash vor dem letzten einzugeben. Der letzte Hash zeigt auf Ihre aktuelle Position (HEAD) und ändert nichts.
quelle
Offensichtlich muss jemand entweder ein verständliches Buch über Git schreiben oder Git muss in der Dokumentation besser erklärt werden. Angesichts des gleichen Problems habe ich das erraten
würde das letzte Commit rückgängig machen, das zu tun scheint.
Ian
quelle
Sie können dies in 4 Schritten tun:
Was Sie in Ihr Terminal eingeben müssen :
git revert <commit_hash>
git reset HEAD~1
git add <file_i_want_to_revert>
&&git commit -m 'reverting file'
git checkout .
Viel Glück
quelle
git-revert
nur das gesamte Repo funktioniert. Um dies zu kompensieren, müssen wir alles andere rückgängig machen.git revert --no-commit <commit_hash>
2.git reset HEAD
Dies spart ein zusätzliches Commit und führt alle Änderungen nur in Ihrem Arbeitsverzeichnis durch.git revert _oldcommit_ --no-commit
git reset -- _unchanged1_ _unchanged2_ ...
git commit -m "branch without changes to specific files"
Die neue Verzweigungsspitze spiegelte alle Änderungen außer den zurückgesetzten Dateien wider.Dies ist ein sehr einfacher Schritt. Checkout-Datei auf die Commit-ID, die wir wollen, hier eine Commit-ID vorher, und dann git Commit-Änderung und fertig.
Das ist sehr praktisch. Wenn wir eine Datei zu einer früheren Festschreibungs-ID am Anfang des Festschreibens bringen möchten, können wir dies problemlos tun.
quelle
Wird ein bestimmtes Commit zurücksetzen. Es hört sich so an, als ob Sie denken, dass dies
git revert
nur das letzte Commit betrifft.Das löst Ihr Problem nicht, wenn Sie eine Änderung in einer bestimmten Datei rückgängig machen möchten und dieses Commit mehr als diese Datei geändert hat.
quelle
Wenn Sie bei Ihren letzten Festschreibungen eine falsche Datei festschreiben, befolgen Sie die Anweisungen:
quelle