Es ist kein Duplikat der Fragen im Zusammenhang mit --hard! Das Risiko, diesen Befehl versehentlich auszuführen, ist viel höher. Zum Beispiel möchten Sie eine einzelne Datei mit entfernen git reset foo-file. Sie schreiben nur den ersten Teil des Dateinamens, drücken die Tabulatortaste für die automatische Vervollständigung, es wird tatsächlich zu einem Zweignamen vervollständigt, Sie bemerken es nicht und führen git reset foo-branchstattdessen den Befehl aus . Voilà
Yushin Washio
Antworten:
2388
Kurze Antwort:
git reset 'HEAD@{1}'
Lange Antwort:
Git führt ein Protokoll aller Ref-Updates (z. B. Auschecken, Zurücksetzen, Festschreiben, Zusammenführen). Sie können es anzeigen, indem Sie Folgendes eingeben:
git reflog
Irgendwo in dieser Liste befindet sich das Commit, das Sie verloren haben. Angenommen, Sie haben gerade getippt git reset HEAD~und möchten es rückgängig machen. Mein Reflog sieht so aus:
$ git reflog
3f6db14 HEAD@{0}: HEAD~: updating HEAD
d27924e HEAD@{1}: checkout: moving from d27924e0fe16776f0d0f1ee2933a0334a4787b4c
[...]
Die erste Zeile besagt, dass vor HEAD0 Positionen (mit anderen Worten, die aktuelle Position) 3f6db14 ist; es wurde durch Zurücksetzen auf erhalten HEAD~. Die zweite Zeile besagt, dass vor HEAD1 Position (mit anderen Worten der Status vor dem Zurücksetzen) d27924e ist. Es wurde durch Auschecken eines bestimmten Commits erhalten (obwohl dies momentan nicht wichtig ist). Um den Reset rückgängig zu machen, führen Sie git reset HEAD@{1}(oder git reset d27924e) aus.
Wenn Sie andererseits seitdem einige andere Befehle ausgeführt haben, die HEAD aktualisieren, steht das gewünschte Commit nicht ganz oben auf der Liste, und Sie müssen die durchsuchen reflog.
Ein letzter Hinweis: Es ist möglicherweise einfacher, nach dem reflogZweig zu suchen, den Sie zurücksetzen möchten, z. B. Master, als nach HEAD:
Als visuellere und schönere Alternative zu reflogdiesem Zweck verwende ich gerne git log --graph --decorate --oneline $(git rev-list -g --all). Es zeigt einen Baum aller Commits, einschließlich baumelnder unbenannter Zweige
Texasflood
1
Nehmen wir an, ich habe ein Verzeichnis mit vorhandenen Dateien. In diesem Verzeichnis laufe ich git initund dann gleich danach git reset --hard. Es gibt zunächst kein Reflog oder gar Protokolle. Sind diese Dateien jetzt so ziemlich Toast?
AlanSE
@ Alanse, leider sind diese Dateien Toast, soweit ich weiß. Wenn Sie dies noch nie getan haben git add(dh diese Version der Datei noch nie bereitgestellt haben), wird git checkoutoder git reset --hardwird die einzige Kopie (das Arbeitsverzeichnis) ohne Sicherung weggeblasen. Ich wünschte, es wäre nicht so.
Mark Lodato
2
git reset HEAD~12oops ... git reset HEAD@{12}nooo .. 'git reflog' zur rettung! Oh, es ist nurgit reset HEAD@{1}
Das scheint großartig - könnten Sie das näher erläutern? Ist "ORIG" hier die Abkürzung für "Original" oder "Ursprung"? … Dh, wird es auf die Position von HEAD zurückgesetzt, bevor mit dem Affen begonnen wurde? Oder wohin HEAD am Ursprung ist? Was passiert, wenn Sie HEAD mehrmals vor dem bewegt haben git reset ORIG_HEAD? Vielen Dank.
Benjohn
ORIG steht für Original, ORIG_HEAD bedeutet Original HEAD vor dem Zurücksetzen
Sam Gallagher
"Bestimmte Vorgänge, wie z. B. Zusammenführen und Zurücksetzen, zeichnen die vorherige Version von HEAD in ORIG_HEAD auf, bevor sie auf einen neuen Wert angepasst wird. Sie können ORIG_HEAD verwenden, um den vorherigen Status wiederherzustellen oder wiederherzustellen oder einen Vergleich durchzuführen." Auszug aus dem Buch: "Versionskontrolle mit Git"
Amirreza
56
Meine Situation war etwas anders, ich habe es git reset HEAD~dreimal gemacht.
Um es rückgängig zu machen, musste ich tun
git reset HEAD@{3}
so sollten Sie in der Lage sein zu tun
git reset HEAD@{N}
Aber wenn Sie Git Reset mit durchgeführt haben
git reset HEAD~3
Sie müssen tun
git reset HEAD@{1}
As {N} steht für die Anzahl der Operationen in Reflog. Wie Mark in den Kommentaren betonte.
Die akzeptierte Option bietet kein Beispiel für die Weiterleitung. NI befand sich vor einer Stunde in einer Situation, in der ich mehr als 1 weiterleiten wollte. Ich habe mit mehreren versucht und es hat funktioniert. Wollte das hier hinzufügen. Wird nützlich sein für Leute, die nach einem Rückgängigmachen des Zurücksetzens mit dem Zurücksetzen des
Gitters
3
aber wenn jemand git reset HEAD ~ 3 gemacht hat, kann er schnell sehen, wie man es rückgängig macht, git reset HEAD @ {3} ist erforderlich, ohne in reflog git reset HEAD ~ 3 usw. zu gehen, ist eine häufige Situation
zainengineer
1
Ich denke, jeder, der {1} / {2} sieht, würde erkennen, dass die Nummer eine beliebige Revisionsnummer sein kann, die reflogIhnen der Befehl zur Verfügung stellt. Einverstanden, dass Ihr Standpunkt, dass die Zahlen für beide Richtungen gleich sind ~ 3 / @ {3}, aber nicht unbedingt eine neue Antwort sein muss.
Clint
30
1.Verwenden Sie git reflog, um alle Referenzen zu aktualisieren.
--hard
! Das Risiko, diesen Befehl versehentlich auszuführen, ist viel höher. Zum Beispiel möchten Sie eine einzelne Datei mit entfernengit reset foo-file
. Sie schreiben nur den ersten Teil des Dateinamens, drücken die Tabulatortaste für die automatische Vervollständigung, es wird tatsächlich zu einem Zweignamen vervollständigt, Sie bemerken es nicht und führengit reset foo-branch
stattdessen den Befehl aus . VoilàAntworten:
Kurze Antwort:
Lange Antwort:
Git führt ein Protokoll aller Ref-Updates (z. B. Auschecken, Zurücksetzen, Festschreiben, Zusammenführen). Sie können es anzeigen, indem Sie Folgendes eingeben:
Irgendwo in dieser Liste befindet sich das Commit, das Sie verloren haben. Angenommen, Sie haben gerade getippt
git reset HEAD~
und möchten es rückgängig machen. Mein Reflog sieht so aus:Die erste Zeile besagt, dass vor
HEAD
0 Positionen (mit anderen Worten, die aktuelle Position) 3f6db14 ist; es wurde durch Zurücksetzen auf erhaltenHEAD~
. Die zweite Zeile besagt, dass vorHEAD
1 Position (mit anderen Worten der Status vor dem Zurücksetzen) d27924e ist. Es wurde durch Auschecken eines bestimmten Commits erhalten (obwohl dies momentan nicht wichtig ist). Um den Reset rückgängig zu machen, führen Siegit reset HEAD@{1}
(odergit reset d27924e
) aus.Wenn Sie andererseits seitdem einige andere Befehle ausgeführt haben, die HEAD aktualisieren, steht das gewünschte Commit nicht ganz oben auf der Liste, und Sie müssen die durchsuchen
reflog
.Ein letzter Hinweis: Es ist möglicherweise einfacher, nach dem
reflog
Zweig zu suchen, den Sie zurücksetzen möchten, z. B. Master, als nachHEAD
:Dies sollte weniger Lärm als der allgemeine haben
HEAD reflog
.quelle
reflog
diesem Zweck verwende ich gernegit log --graph --decorate --oneline $(git rev-list -g --all)
. Es zeigt einen Baum aller Commits, einschließlich baumelnder unbenannter Zweigegit init
und dann gleich danachgit reset --hard
. Es gibt zunächst kein Reflog oder gar Protokolle. Sind diese Dateien jetzt so ziemlich Toast?git add
(dh diese Version der Datei noch nie bereitgestellt haben), wirdgit checkout
odergit reset --hard
wird die einzige Kopie (das Arbeitsverzeichnis) ohne Sicherung weggeblasen. Ich wünschte, es wäre nicht so.git reset HEAD~12
oops ...git reset HEAD@{12}
nooo .. 'git reflog' zur rettung! Oh, es ist nurgit reset HEAD@{1}
Alte Frage und die geposteten Antworten funktionieren hervorragend. Ich werde mich jedoch für eine andere Option entscheiden.
git reset ORIG_HEAD
ORIG_HEAD
verweist auf das Commit, auf dasHEAD
zuvor verwiesen wurde.quelle
git reset ORIG_HEAD
? Vielen Dank.Meine Situation war etwas anders, ich habe es
git reset HEAD~
dreimal gemacht.Um es rückgängig zu machen, musste ich tun
so sollten Sie in der Lage sein zu tun
Aber wenn Sie Git Reset mit durchgeführt haben
Sie müssen tun
As {N} steht für die Anzahl der Operationen in Reflog. Wie Mark in den Kommentaren betonte.
quelle
reflog
Ihnen der Befehl zur Verfügung stellt. Einverstanden, dass Ihr Standpunkt, dass die Zahlen für beide Richtungen gleich sind ~ 3 / @ {3}, aber nicht unbedingt eine neue Antwort sein muss.1.Verwenden Sie
git reflog
, um alle Referenzen zu aktualisieren.2.
git reset <id_of_commit_to_which_you_want_restore>
quelle