Wie kann ich den Git-Reset rückgängig machen --hard HEAD ~ 1?

1158

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

git reset --hard HEAD~1
Paul Wicks
quelle
8
Ich habe einen vollständigen Leitfaden zur Wiederherstellung eines verlorenen Commits mit git geschrieben. Es hat sogar Illustrationen :-) [Check it out] [fixLink] [fixLink]: programblings.com/2008/06/07/…
Webmat
12
--hardverwirft nicht festgeschriebene Änderungen. Da diese nicht von Git verfolgt werden, gibt es keine Möglichkeit, sie über Git wiederherzustellen.
Zaz
1
Dies ist ein großartiger Artikel, der Sie bei der Wiederherstellung Ihrer Dateien unterstützt.
Jan Swart
2
Dies ist eine großartige Ressource direkt von Github: Wie man (fast) alles mit Git rückgängig macht
jasonleonhard

Antworten:

1773

Pat Notz ist richtig. Sie können das Commit zurückerhalten, solange es innerhalb weniger Tage erfolgt ist. Git sammelt nur Müll nach ungefähr einem Monat oder so, es sei denn, Sie weisen ihn ausdrücklich 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 infolge des Hard-Reset entfernt wurde, aber beim Zurücksetzen über das Reflog wieder eingesetzt wurde.

Brian Riehman
quelle
222
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.
Jakub Narębski
39
git log -gkann ein bisschen schöner sein, um das Reflog zu sehen als git reflog.
Dan Moulding
60
Es gibt eine sehr wichtige Einschränkung dabei ... und das ist der "- harte" Teil. --hard bläst Ihre lokalen nicht festgeschriebenen Änderungen weg. Und Sie können sie nicht so zurückbekommen (da sie nirgendwo begangen wurden). Ich glaube, Sie können nichts dagegen tun :(
Michael Anderson
3
^ Nur damit Sie wissen, dass Sie Ihre lokalen Änderungen vor dem Zurücksetzen speichern können - hart, und sie dann einfach einfügen und nichts verlieren! Muss ich lieben git.
Lethjakman
5
Ich bevorzuge git refloges git log -geinfach, weil Sie alle Informationen in einer Zeile mit sha1, HEAD-Informationen und Commit-Nachrichten erhalten. Viel einfacher zu lesen.
Snowcrash
371

Sie möchten lediglich die sha1 des Commits angeben, auf dem Sie wiederherstellen möchten. Sie können die sha1 erhalten, indem Sie das reflog ( git reflog) untersuchen und dann tun

git reset --hard <sha1 of desired commit>

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

Pat Notz
quelle
2
Warnung für mich vor ein paar Minuten: Dadurch werden alle Änderungen zurückgesetzt. Die nicht verfolgten Dateien werden jedoch nicht berührt.
Aexl
175

Die Antwort ist in der obigen detaillierten Antwort versteckt. Sie können einfach Folgendes tun:

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

(Siehe die Ausgabe von Git Reflog Show )

markmc
quelle
17
Beachten Sie, dass dies nicht die Lösung ist, wenn Sie seit dem Zurücksetzen andere Repo-Änderungen vorgenommen haben. Schauen Sie sich auf jeden Fall das Reflog an, bevor Sie etwas ausführen.
Forresthopkinsa
2
Ich habe versehentlich mein Repository zurückgesetzt und dachte, meine Arbeit wäre für immer verloren. Diese Antwort hat mir den Tag gerettet.
Zaiyang Li
woh! du
rettest
Großartig. Es hat wirklich geholfen.
Prashant Biradar
117

Es ist möglich, es wiederherzustellen, wenn Git noch keinen Müll gesammelt hat.

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

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

Stellen Sie das baumelnde Commit mit Rebase wieder her:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf
sverrejoh
quelle
1
Das ist großartiges Zeug. Leben gerettet.
Mohhamad Hasham
Eine ausführliche Erklärung finden Sie hier: medium.com/@CarrieGuss/… . Lebensrettendes Zeug.
tuan.dinh
49

Wenn Sie wirklich Glück haben, wie ich es war, können Sie in Ihren Texteditor zurückkehren und auf "Rückgängig" klicken.

Ich weiß, dass das nicht wirklich die richtige Antwort ist, aber es hat mir einen halben Tag Arbeit erspart, also hoffentlich wird es dasselbe für jemand anderen tun!

Chris
quelle
3
Dies ist eigentlich ein sehr guter Tipp, der mich viele Male gerettet hat;) Und es ist einfacher als alles in Git zu tun ...
Severin
3
und danke aller Güte, die in dieser ganzen Welt gnädig ist. Vielen Dank. Vielen Dank. Vielen Dank.
Reise
9
Dies ist die einzige Möglichkeit, nicht bereitgestellte Änderungen in Dateien nach dem Hard-Reset wiederherzustellen. Hat mich auch gerettet;)
Czarek Tomczak
4
Als zusätzlichen Hinweis wird bei einigen IDEs als Eclipse auch der aktuelle Dateiversionsverlauf gespeichert. Auf diese Weise können Sie möglicherweise sogar ältere Änderungen wiederherstellen, nachdem der Editor geschlossen wurde. Das hat Wunder für mich gewirkt.
Martin
1
Gott segne dich Chris
Adam Waite
45

Soweit ich weiß, --hardwerden nicht festgeschriebene Änderungen verworfen. Da diese nicht von git verfolgt werden. aber Sie können das rückgängig machen discarded commit.

$ git reflog

Willenslisten:

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

wo 4bac331ist das discarded commit.

Bewegen Sie nun einfach den Kopf zu diesem Commit ::

$ git reset --hard 4bac331
suhailvs
quelle
34

Beispiel für einen IRL-Fall:

$ git fsck --lost-found

Checking object directories: 100% (256/256), done.
Checking objects: 100% (3/3), done.
dangling blob 025cab9725ccc00fbd7202da543f556c146cb119
dangling blob 84e9af799c2f5f08fb50874e5be7fb5cb7aa7c1b
dangling blob 85f4d1a289e094012819d9732f017c7805ee85b4
dangling blob 8f654d1cd425da7389d12c17dd2d88d318496d98
dangling blob 9183b84bbd292dcc238ca546dab896e073432933
dangling blob 1448ee51d0ea16f259371b32a557b60f908d15ee
dangling blob 95372cef6148d980ab1d7539ee6fbb44f5e87e22
dangling blob 9b3bf9fb1ee82c6d6d5ec9149e38fe53d4151fbd
dangling blob 2b21002ca449a9e30dbb87e535fbd4e65bac18f7
dangling blob 2fff2f8e4ea6408ac84a8560477aa00583002e66
dangling blob 333e76340b59a944456b4befd0e007c2e23ab37b
dangling blob b87163c8def315d40721e592f15c2192a33816bb
dangling blob c22aafb90358f6bf22577d1ae077ad89d9eea0a7
dangling blob c6ef78dd64c886e9c9895e2fc4556e69e4fbb133
dangling blob 4a71f9ff8262701171d42559a283c751fea6a201
dangling blob 6b762d368f44ddd441e5b8eae6a7b611335b49a2
dangling blob 724d23914b48443b19eada79c3eb1813c3c67fed
dangling blob 749ffc9a412e7584245af5106e78167b9480a27b
dangling commit f6ce1a403399772d4146d306d5763f3f5715cb5a    <- it's this one

$ git show f6ce1a403399772d4146d306d5763f3f5715cb5a

commit f6ce1a403399772d4146d306d5763f3f5715cb5a
Author: Stian Gudmundsen Høiland <[email protected]>
Date:   Wed Aug 15 08:41:30 2012 +0200

    *MY COMMIT MESSAGE IS DISPLAYED HERE*

diff --git a/Some.file b/Some.file
new file mode 100644
index 0000000..15baeba
--- /dev/null
+++ b/Some.file
*THE WHOLE COMMIT IS DISPLAYED HERE*

$ git rebase f6ce1a403399772d4146d306d5763f3f5715cb5a

First, rewinding head to replay your work on top of it...
Fast-forwarded master to f6ce1a403399772d4146d306d5763f3f5715cb5a.
Stian Høiland
quelle
2
Dangling Blob klingt wie ein AD & D-Monster!
Sbichenko
Danke @Stian Gut erklärt! Ich möchte für andere hinzufügen, die diese Antwort finden, dass wenn Sie mehr als ein "baumelndes" Commit haben, es nicht sicher ist, ob Sie eine Rebase in der letzten Zeile durchführen
möchten
Git Show hat einige meiner Dateien gespeichert, vielen Dank, Alter!
William
32

In den meisten Fällen ja.

Abhängig von dem Status, in dem sich Ihr Repository befand, als Sie den Befehl ausgeführt haben, können die Auswirkungen git reset --hardvon trivial über rückgängig bis grundsätzlich unmöglich reichen.

Im Folgenden habe ich eine Reihe verschiedener möglicher Szenarien aufgelistet und wie Sie sich davon erholen können.

Alle meine Änderungen wurden festgeschrieben, aber jetzt sind die Festschreibungen weg!

Diese Situation tritt normalerweise auf, wenn Sie git resetmit einem Argument wie in ausgeführt werden git reset --hard HEAD~. Keine Sorge, das ist leicht zu beheben!

Wenn Sie gerade gelaufen sind git resetund seitdem nichts mehr getan haben, können Sie mit diesem Einzeiler dorthin zurückkehren, wo Sie waren:

git reset --hard @{1}

Dadurch wird Ihr aktueller Zweig in den Status zurückgesetzt, in dem er sich vor der letzten Änderung befand (in Ihrem Fall ist die letzte Änderung am Zweig der Hard-Reset, den Sie rückgängig machen möchten).

Wenn Sie jedoch seit dem Zurücksetzen andere Änderungen an Ihrem Zweig vorgenommen haben, funktioniert der oben genannte Einzeiler nicht. Stattdessen sollten Sie eine Liste aller zuletzt an Ihrem Zweig vorgenommenen Änderungen (einschließlich Zurücksetzen) anzeigen. Diese Liste sieht ungefähr so ​​aus:git reflog <branchname>

7c169bd master@{0}: reset: moving to HEAD~
3ae5027 master@{1}: commit: Changed file2
7c169bd master@{2}: commit: Some change
5eb37ca master@{3}: commit (initial): Initial commit

Suchen Sie in dieser Liste den Vorgang, den Sie "rückgängig machen" möchten. Im obigen Beispiel wäre es die erste Zeile mit der Aufschrift "Zurücksetzen: Bewegen zu HEAD ~". Kopieren Sie dann die Darstellung des Commits vor (unten) dieser Operation. In unserem Fall wäre dies master@{1}(oder 3ae5027beide stellen dasselbe Commit dar) und wird ausgeführt git reset --hard <commit>, um Ihren aktuellen Zweig auf dieses Commit zurückzusetzen.

Ich habe meine Änderungen mit inszeniert, mich git addaber nie verpflichtet. Jetzt sind meine Änderungen weg!

Dies ist etwas schwieriger zu beheben. git verfügt zwar über Kopien der von Ihnen hinzugefügten Dateien, aber da diese Kopien nie an ein bestimmtes Commit gebunden waren, können Sie die Änderungen nicht auf einmal wiederherstellen. Stattdessen müssen Sie die einzelnen Dateien in der Datenbank von git suchen und manuell wiederherstellen. Sie können dies mit tun git fsck.

Weitere Informationen hierzu finden Sie unter Rückgängig machen des Zurücksetzens von Git --hard mit nicht festgeschriebenen Dateien im Staging-Bereich .

Ich hatte Änderungen an Dateien in meinem Arbeitsverzeichnis, mit denen ich nie inszeniert git addund nie festgeschrieben habe. Jetzt sind meine Änderungen weg!

Oh oh. Ich hasse es, Ihnen das zu sagen, aber Sie haben wahrscheinlich kein Glück. git speichert keine Änderungen, die Sie nicht hinzufügen oder festschreiben, und gemäß der Dokumentation fürgit reset :

--schwer

Setzt den Index und den Arbeitsbaum zurück. Alle Änderungen an nachverfolgten Dateien im Arbeitsbaum seitdem <commit>werden verworfen.

Es ist möglich , dass Sie vielleicht Ihre Änderungen mit irgendeiner Art von Disk Recovery - Dienstprogramm oder einem professionellen Datenrettungs - Service erholen können, aber an diesem Punkt, als es wert ist wahrscheinlich mehr Mühe ist.

Ajedi32
quelle
1
Einzeiler hat für mich gearbeitet, danke, aber ich frage mich nur, was genau das "@ {1}" bewirkt.
Stan Bashtavenko
1
@StanB Die Dokumentation finden Sie hier: git-scm.com/docs/git-rev-parse bezieht sich im Wesentlichen auf den ersten Reflog-Eintrag in der aktuellen Verzweigung.
Ajedi32
Vielen Dank, dass Sie alle Fälle abgedeckt haben. Ich hatte meine nicht begangen oder hinzugefügt.
xdhmoore
21

Wenn Sie Ihr Repository noch nicht mit Müll gesammelt haben (z. B. mit git repack -doder git gc, aber beachten Sie, dass die Speicherbereinigung auch automatisch erfolgen kann), ist Ihr Commit immer noch vorhanden - es ist nur nicht mehr über den HEAD erreichbar.

Sie können versuchen, Ihr Commit zu finden, indem Sie die Ausgabe von durchsehen git fsck --lost-found .

Neuere Versionen von Git haben das sogenannte "Reflog", ein Protokoll aller Änderungen, die an den Refs vorgenommen werden (im Gegensatz zu Änderungen, die am Repository-Inhalt vorgenommen werden). So wird beispielsweise jedes Mal, wenn Sie Ihren HEAD wechseln (dh jedes Mal, wenn Sie einen git checkoutZweig wechseln), der protokolliert wird. Und natürlich haben Sie git resetauch den KOPF manipuliert, sodass er auch protokolliert wurde. Sie können auf ältere Status Ihrer Refs auf ähnliche Weise zugreifen wie auf ältere Status Ihres Repositorys, indem Sie ein @Zeichen anstelle eines ~, wie verwendengit reset HEAD@{1} .

Es hat eine Weile gedauert, bis ich verstanden habe, was der Unterschied zwischen HEAD @ {1} und HEAD ~ 1 ist. Hier ist eine kleine Erklärung:

git init
git commit --allow-empty -mOne
git commit --allow-empty -mTwo
git checkout -b anotherbranch
git commit --allow-empty -mThree
git checkout master # This changes the HEAD, but not the repository contents
git show HEAD~1 # => One
git show HEAD@{1} # => Three
git reflog

Bedeutet HEAD~1also "gehe zum Commit vor dem Commit, auf das HEAD derzeit zeigt", währendHEAD@{1} bedeutet "Gehe zu dem Commit, auf das HEAD zeigte, bevor es darauf zeigte, wo es aktuell zeigt".

Auf diese Weise können Sie Ihr verlorenes Commit leicht finden und wiederherstellen.

Jörg W Mittag
quelle
2
Eine andere Erklärung, die ich für klarer halte: HEAD ~ 1 bedeutet, zu "Eltern von HEAD" zu gehen, während HEAD @ {1} zu "einen Schritt in der Geschichte von HEAD zurückgehen" geht
kizzx2
1
Das Problem ist, dass der Begriff "Verlauf" in VCSs wirklich überladen ist. Ein weiterer Ausdruck wäre, dass ~ in der Commit-Geschichte rückwärts geht, während @ in der chronologischen oder zeitlichen Geschichte rückwärts geht . Aber keine der drei Versionen ist besonders gut.
Jörg W Mittag
@ kizzx2 (und Jorg) tatsächlich helfen diese 3 Erklärungen, wenn sie zusammengenommen viel helfen - danke
Richard Le Mesurier
14

Bevor Sie antworten, fügen Sie einige Hintergrundinformationen hinzu und erklären, was dies ist HEAD.

First of all what is HEAD?

HEADist einfach ein Verweis auf das aktuelle Commit (aktuell) in der aktuellen Verzweigung.
Es kann immer nur eine einzige HEADgeben. (ausgenommen git worktree)

Der Inhalt von HEADwird darin gespeichert .git/HEADund enthält die 40 Bytes SHA-1 des aktuellen Commits.


detached HEAD

Wenn Sie sich nicht im letzten Commit befinden, bedeutet dies, dass HEADauf ein vorheriges Commit in der Geschichte verwiesen wird detached HEAD.

Geben Sie hier die Bildbeschreibung ein

In der Befehlszeile sieht es so aus: SHA-1 anstelle des Zweignamens, da der HEADnicht auf die Spitze des aktuellen Zweigs zeigt

Geben Sie hier die Bildbeschreibung ein


Einige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Dadurch wird ein neuer Zweig ausgecheckt, der auf das gewünschte Commit verweist.
Dieser Befehl checkt zu einem bestimmten Commit aus.
An diesem Punkt können Sie einen Zweig erstellen und ab diesem Punkt mit der Arbeit beginnen.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Sie können immer die verwenden reflog .
git reflogzeigt jede Änderung an, die das aktualisiert hat, HEADund das Auschecken des gewünschten Reflog-Eintrags setzt dasHEAD diesen Commit zurück.

Jedes Mal, wenn der KOPF geändert wird, wird ein neuer Eintrag in der reflog

git reflog
git checkout HEAD@{...}

Dadurch kehren Sie zu Ihrem gewünschten Commit zurück

Geben Sie hier die Bildbeschreibung ein


git reset HEAD --hard <commit_id>

Bewegen Sie Ihren Kopf zurück zum gewünschten Commit.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Hinweis: ( Seit Git 2.7 ) können
    Sie auch das verwenden git rebase --no-autostash.


git revert <sha-1>

"Rückgängig machen" des angegebenen Commits oder Commit-Bereichs.
Der Befehl zum Zurücksetzen "macht" alle Änderungen rückgängig, die im angegebenen Commit vorgenommen wurden.
Ein neues Commit mit dem Undo-Patch wird festgeschrieben, während das ursprüngliche Commit ebenfalls im Verlauf verbleibt.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen können, reset && checkoutändern Sie die HEAD.

Geben Sie hier die Bildbeschreibung ein

CodeWizard
quelle
Es scheint, dass Ihr git reset HEAD --hard <commit_id>Beispiel von stackoverflow.com/questions/4114095/… stammt. - Wenn dies der Fall ist, können Sie dies bitte in der Namensnennung bearbeiten.
Rob
12

git reflog

  • Suchen Sie Ihr Commit in der Liste, kopieren Sie es und fügen Sie es in diesen Befehl ein:

git cherry-pick <the sha>

ScottyBlades
quelle
1
git-cherry-pick - Übernehmen Sie die Änderungen, die durch einige vorhandene Commits eingeführt wurden. Ich denke, es ist einfach und in diesem Zusammenhang sehr hilfreich
Amitesh
1
Jeder sucht tatsächlich danach, wenn er nach Möglichkeiten sucht, Änderungen am Hard-Reset rückgängig zu machen. Diese Antwort sollte mehr Zustimmung bekommen
ErenL
@ErenL Ich denke, ich habe nur gedacht, die Leute machen gerne zusätzliche Arbeit. haha
ScottyBlades
1
Das ist es, du hast gerade meinen Tag gerettet 🙂
Sylvernus Akubo
11

Ich weiß, dass dies ein alter Thread ist ... aber da viele Leute nach Möglichkeiten suchen, Dinge in Git rückgängig zu machen, halte ich es dennoch für eine gute Idee, hier weiterhin Tipps zu geben.

Wenn Sie ein "Git hinzufügen" oder etwas von oben links nach unten links in Git GUI verschieben, wird der Inhalt der Datei in einem Blob gespeichert und der Dateiinhalt kann von diesem Blob wiederhergestellt werden.

So ist es möglich, eine Datei wiederherzustellen, auch wenn sie nicht festgeschrieben wurde, aber hinzugefügt werden muss.

git init  
echo hello >> test.txt  
git add test.txt  

Jetzt wird der Blob erstellt, aber er wird vom Index referenziert, sodass er erst mit git fsck aufgelistet wird, wenn wir ihn zurücksetzen. Also setzen wir zurück ...

git reset --hard  
git fsck  

Sie erhalten einen baumelnden Blob ce013625030ba8dba906f756967f9e9ca394464a

git show ce01362  

gibt Ihnen den Dateiinhalt "Hallo" zurück

Um nicht referenzierte Commits zu finden, habe ich irgendwo einen Tipp gefunden, der dies vorschlägt.

gitk --all $(git log -g --pretty=format:%h)  

Ich habe es als Werkzeug in Git Gui und es ist sehr praktisch.

Martin
quelle
+1. Wie unter stackoverflow.com/a/21350689/6309 erwähnt , git fsck --lost-foundkann dies helfen.
VonC
7

Wenn Sie eine JetBrains-IDE (alles, was auf IntelliJ basiert) verwenden, können Sie auch Ihre nicht festgeschriebenen Änderungen über die Funktion "Lokaler Verlauf" wiederherstellen.

Klicken Sie mit der rechten Maustaste auf Ihr oberstes Verzeichnis in Ihrer Dateibaumstruktur, suchen Sie im Kontextmenü nach "Lokaler Verlauf" und wählen Sie "Verlauf anzeigen". Dies öffnet eine Ansicht, in der Ihre letzten Änderungen gefunden werden können. Wenn Sie die Revision gefunden haben, zu der Sie zurückkehren möchten, klicken Sie mit der rechten Maustaste darauf und klicken Sie auf "Zurücksetzen".

Newbyte
quelle
4

Ich habe gerade einen Hard-Reset für ein falsches Projekt durchgeführt. Was mein Leben rettete, war die lokale Geschichte von Eclipse. IntelliJ Idea soll auch eine haben, und Ihr Redakteur kann es auch überprüfen:

  1. Eclipse-Hilfethema zum lokalen Verlauf
  2. http://wiki.eclipse.org/FAQ_Where_is_the_workspace_local_history_stored%3F
Maciek Łoziński
quelle
1
Jetbrains CLion lokale Geschichte ist hervorragend und sparte 2 Stunden Arbeit für mich :)
Fabian Knapp
3

Erstellt ein winziges Skript, um das Auffinden des gesuchten Commits etwas zu erleichtern:

git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -i git show \{\} | egrep '^commit |Date:'

Ja, es kann mit awk oder so etwas wesentlich hübscher gemacht werden, aber es ist einfach und ich brauchte es einfach. Könnte jemand anderem 30 Sekunden sparen.

Neuron
quelle
0

Mein Problem ist fast ähnlich. Ich habe nicht festgeschriebene Dateien, bevor ich eingebe git reset --hard.

Gott sei Dank. Ich habe es geschafft, all diese Ressourcen zu überspringen. Nachdem ich bemerkt habe, dass ich einfach rückgängig machen kann (ctrl-z ). 😊 Ich möchte dies nur zu allen obigen Antworten hinzufügen.

Hinweis. Es ist nicht möglich, ctrl-zDateien zu öffnen.

Vadamadafaka
quelle
0

Das hat mein Leben gerettet: https://medium.com/@CarrieGuss/how-to-recover-from-a-git-hard-reset-b830b5e3f60c

Grundsätzlich müssen Sie ausführen:

for blob in $(git fsck --lost-found | awk ‘$2 == “blob” { print $3 }’); do git cat-file -p $blob > $blob.txt; done

Gehen Sie dann manuell durch die Schmerzen, um Ihre Dateien in der richtigen Struktur neu zu organisieren.

Imbiss: Verwenden git reset --hardSie es niemals, wenn Sie nicht zu 100% verstehen, wie es funktioniert. Verwenden Sie es am besten nicht.

tuan.dinh
quelle