1660 Stimmen

Wie kann ich git reset --hard HEAD~1 rückgängig machen?

Ist es möglich, die durch den folgenden Befehl verursachten Änderungen rückgängig zu machen? Wenn ja, wie?

git reset --hard HEAD~1

15 Stimmen

Ich habe eine vollständige Anleitung zur Wiederherstellung eines verlorenen Commits mit Git geschrieben. Es gibt sogar Illustrationen :-) [Check it out][fixLink] [fixLink]: programblings.com/2008/06/07/

38 Stimmen

--hard verwirft unbestätigte Änderungen. Da diese nicht von Git verfolgt werden, gibt es keine Möglichkeit, sie mit Git wiederherzustellen.

0 Stimmen

2441voto

Brian Riehman Punkte 24780

Pat Notz hat recht. Sie können den Commit zurückbekommen, solange er nicht länger als ein paar Tage zurückliegt. Git sammelt Müll erst nach etwa einem Monat oder so, es sei denn, Sie weisen es explizit an, neuere Blobs zu entfernen.

$ git init
Initialized empty Git repository in .git/

$ echo "testing reset" > file1
$ git add file1
$ git commit -m 'added file1'
Created initial commit 1a75c1d: added file1
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file1

$ echo "added new file" > file2
$ git add file2
$ git commit -m 'added file2'
Created commit f6e5064: added file2
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file2

$ git reset --hard HEAD^
HEAD is now at 1a75c1d... added file1

$ cat file2
cat: file2: No such file or directory

$ git reflog
1a75c1d... HEAD@{0}: reset --hard HEAD^: updating HEAD
f6e5064... HEAD@{1}: commit: added file2

$ git reset --hard f6e5064
HEAD is now at f6e5064... added file2

$ cat file2
added new file

Sie können im Beispiel sehen, dass die Datei2 als Ergebnis des Hard-Resets entfernt wurde, aber wiederhergestellt wurde, als ich über das Reflog zurückgesetzt habe.

292 Stimmen

Sie können "git reset --hard HEAD@{1}" verwenden, ohne SHA1 verwenden zu müssen. In den meisten Fällen sollte es ausreichen, "git reset --hard ORIG_HEAD" zu verwenden.

50 Stimmen

git log -g kann eine etwas schönere Art sein, das Reflog zu betrachten als git reflog .

92 Stimmen

Es gibt eine sehr wichtige Einschränkung und das ist der "--hard" Teil. --hard löscht Ihre lokalen, nicht bestätigten Änderungen. Und Sie können sie so nicht wiederherstellen (da sie nirgendwo übertragen wurden). Ich glaube, da kann man nichts machen :(

543voto

Pat Notz Punkte 196406

Sie müssen den sha1-Wert der Übertragung angeben, die Sie wiederherstellen möchten. Sie können den sha1 erhalten, indem Sie das reflog untersuchen ( git reflog ) und dann die

git reset --hard <sha1 of desired commit>

Aber warten Sie nicht zu lange... nach ein paar Wochen wird Git diesen Commit als nicht referenziert ansehen und alle Blobs löschen.

10 Stimmen

Warnung für mich selbst vor ein paar Minuten: Damit werden alle Änderungen zurückgesetzt. Die nicht verfolgten Dateien werden allerdings nicht berührt.

1 Stimmen

Danke, das hat mich gerettet, nachdem ich versehentlich einen großen Commit entfernt hatte. Git sollte wirklich einen Bestätigungsdialog für diese Befehle haben.

275voto

markmc Punkte 3312

Die Antwort ist in der ausführlichen Antwort oben versteckt, Sie können einfach tun:

$> git reset --hard HEAD@{1}

(Siehe die Ausgabe von git reflog show )

30 Stimmen

Beachten Sie, dass dies nicht die Lösung ist, wenn Sie seit dem Zurücksetzen andere Änderungen am Repository vorgenommen haben. Werfen Sie auf jeden Fall einen Blick auf das Reflog, bevor Sie etwas ausführen.

2 Stimmen

Ich habe versehentlich mein Repository zurückgesetzt und dachte, meine Arbeit sei für immer verloren. Diese Antwort hat mir den Tag gerettet.

2 Stimmen

Wow! Du hast mir wirklich den Tag gerettet =)

190voto

suhailvs Punkte 17111

Soviel ich weiß, --hard verwirft nicht übertragene Änderungen. Da diese nicht von Git verfolgt werden. Aber Sie können die discarded commit .

$ git reflog

wird aufgelistet:

b0d059c HEAD@{0}: reset: moving to HEAD~1
4bac331 HEAD@{1}: commit: added level introduction....
....

donde 4bac331 ist die discarded commit .

Bewegen Sie nun einfach den Kopf zu diesem Commit:

$ git reset --hard 4bac331

22 Stimmen

Du hast mich vor der Entlassung gerettet

1 Stimmen

Du hast unserem Praktikanten sein Praktikum gerettet :-D

151voto

sverrejoh Punkte 15734

Es ist möglich, es wiederherzustellen, wenn Git noch keinen Garbage Collect durchgeführt hat.

Verschaffen Sie sich einen Überblick über "Dangling Commits" mit fsck :

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

Wiederherstellen der hängengebliebenen Übergabe mit rebase:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

2 Stimmen

Das ist geniales Zeug. Leben gerettet.

2 Stimmen

Eine ausführliche Erklärung finden Sie hier: medium.com/@CarrieGuss/ . Lebensrettendes Zeug.

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