Frage

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

git reset --hard HEAD~1
War es hilfreich?

Lösung

Pat Notz korrekt ist.Sie können das commit zurück, so lange, wie es war innerhalb von ein paar Tagen.git nur Müll sammelt nach ungefähr einem Monat oder so, wenn Sie nicht ausdrücklich sagen, es zu entfernen neuere blobs.

$ 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 wurde entfernt, da infolge der hard-reset wurde aber wieder wenn ich reset über das reflog.

Andere Tipps

Was Sie tun möchten, ist geben Sie den sha1-Hash des Commits, die Sie wiederherstellen möchten.Sie können den sha1-durch die Untersuchung der reflog (git reflog) und dann

git reset --hard <sha1 of desired commit>

Aber nicht zu lange warten...nach ein paar Wochen git schließlich sehen, die sich als " nicht referenzierte und löschen Sie alle blobs.

Die Antwort versteckt sich in die ausführliche Antwort oben, Sie können einfach tun:

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

(Siehe die Ausgabe von git reflog show)

Es ist möglich, Sie wiederherzustellen, wenn Sie Git noch nicht Müll gesammelt hast.

Erhalten Sie einen überblick über baumelnden begeht mit fsck:

$ git fsck --lost-found
dangling commit b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

Wiederherstellen der dangling commit mit rebase:

$ git rebase b72e67a9bb3f1fc1b64528bcce031af4f0d6fcbf

Wenn Sie wirklich glücklich, wie ich war, können Sie gehen zurück in Ihre text-editor und klicken Sie auf "rückgängig".

Ich weiß, das ist nicht wirklich eine richtige Antwort, aber es hat mich einen halben Tag Arbeit, so hoffentlich werde das gleiche tun für jemand anderes!

Beispiel 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 <stian@Stians-Mac-mini.local>
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.

soweit ich weiß, --hard wird verwirft, die nicht übergebenen änderungen.Da diese nicht von git verwaltet.aber Sie können rückgängig machen die discarded commit.

$ git reflog

wird Listen:

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

wo 4bac331 ist die discarded commit.

Jetzt nur noch den Kopf bewegen, um das commit:

$ git reset --hard 4bac331

In den meisten Fällen, ja.

Je nach Zustand Ihres Repositorys war, wenn Sie den Befehl ausgeführt, die Auswirkungen von git reset --hard kann reichen von trivial rückgängig zu machen, um im Grunde unmöglich.

Unten habe ich eine Liste mit einer Reihe von verschiedenen möglichen Szenarien, und wie Sie vielleicht erholen sich von Ihnen.

Alle meine änderungen, die begangen wurden, aber jetzt sind die verpflichtet sind Weg!

Diese situation tritt normalerweise auf, wenn Sie laufen git reset mit einem argument, wie in git reset --hard HEAD~.Keine Sorge, dies ist einfach zu erholen!

Wenn Sie lief nur git reset und noch nie etwas anderes getan, da können Sie kommen zurück zu, wo Sie waren, mit diesem one-liner:

git reset --hard @{1}

Dies setzt den aktuellen branch welchem Zustand war es in, bevor Sie das Letzte mal geändert wurde (in Ihrem Fall, die jüngste änderung der Verzweigung der hard-reset Sie versuchen, Sie rückgängig zu machen).

Wenn Sie jedoch haben weitere änderungen an Ihren Zweig, die seit dem zurücksetzen der one-liner oben wird nicht funktionieren.Stattdessen sollten Sie ausführen git reflog <branchname> um eine Liste aller letzten änderungen an Ihren Zweig (einschließlich zurückgesetzt).Diese Liste wird wie folgt Aussehen:

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

Finden Sie den Betrieb in dieser Liste, Sie "rückgängig".Im obigen Beispiel wäre es die erste Zeile, die eine, die sagt "zurücksetzen:moving HEAD~".Dann kopieren Sie die Darstellung der commit bevor (unten) die Bedienung.In unserem Fall wäre master@{1} (oder 3ae5027, Sie beide vertreten die gleichen commit), und führen Sie git reset --hard <commit> zum zurücksetzen Ihres aktuellen Zweig zurück zu Begehen.

Ich inszenierte meine änderungen mit git add, aber nie begangen.Jetzt sind meine änderungen Weg!

Dies ist ein bisschen schwieriger zu erholen.git tut Kopien der Dateien, die Sie Hinzugefügt haben, aber da diese Exemplare wurden nie gebunden, zu einem bestimmten Begehen Sie nicht wiederherstellen können, die änderungen alle auf einmal.Stattdessen müssen Sie suchen, um die einzelnen Dateien in die git Datenbank und diese wiederherstellen, manuell.Sie können dies tun, indem git fsck.

Für details, siehe Rückgängig machen git reset --hard commit-Dateien in den staging-Bereich.

Ich hatte änderungen an den Dateien im Arbeitsverzeichnis, dass ich nie inszeniert git add, und nie begangen.Jetzt sind meine änderungen Weg!

Uh oh.Ich hasse es, Ihnen dies mitzuteilen, aber du bist wahrscheinlich kein Glück.git speichert keine änderungen, die Sie nicht hinzufügen oder übertragen, und nach der Dokumentation git reset:

--hard

Setzt den index und arbeiten Baum. Änderungen an nachverfolgten Dateien in das arbeiten im Baum, da <commit> werden verworfen.

Es ist möglich, dass Sie könnte erholen können Sie Ihre änderungen mit irgendeiner Art von Festplatte recovery-Dienstprogramm oder eine professionelle Daten-recovery-service, aber an diesem Punkt, das ist wahrscheinlich mehr Mühe als es Wert ist.

Wenn Sie noch nicht Müll gesammelt repository (z.B.Verwendung git repack -d oder git gc, beachten Sie aber bitte, dass die garbage collection kann auch automatisch passieren), dann Ihr commit ist immer noch da – es ist nur nicht mehr erreichbar durch den KOPF.

Sie können versuchen, Sie zu finden Ihre Begehen, indem man durch die Ausgabe von git fsck --lost-found.

Neuere Versionen von Git haben etwas namens "reflog", die ein Protokoll aller änderungen, die gemacht werden, um die refs (im Gegensatz zu änderungen an den repository-Inhalt).So, zum Beispiel, jedes mal, wenn Sie schalten Sie Ihren KOPF (z.B.jedes mal, wenn Sie eine git checkout wechseln Niederlassungen) werden protokolliert.Und, natürlich, Ihre git reset auch manipuliert den KOPF, so war es hier auch angemeldet.Sie können auf ältere Versionen Ihrer refs in einer ähnlichen Weise, dass Sie Zugriff auf ältere Zustände des repository mithilfe eines @ melden Sie anstelle eines ~, wie git reset HEAD@{1}.

Es dauerte eine Weile, um zu verstehen, was der Unterschied ist zwischen HEAD@{1} und HEAD~1, so ist hier 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

So, HEAD~1 bedeutet "gehen, um das commit vor dem commit, der KOPF derzeit Punkte an", während HEAD@{1} bedeutet "gehen, um den commit, der KOPF wies an, bevor er zeigte auf, wo es derzeit Punkte an".

Erlaubt Sie leicht zu finden Ihre verlorene Begehen und wiederherstellen.

Ich weiß, das ist ein Alter thread...aber wie viele Menschen sind auf der Suche nach Möglichkeiten, um rückgängig Sachen im Git, ich denke immer noch, es kann eine gute Idee sein, um auch weiterhin geben Tipps hier.

Wenn Sie "git add" oder verschieben Sie alles von oben Links nach unten Links in git-gui den Inhalt der Datei gespeichert ist, in ein blob und der Inhalt der Datei wiederherstellen aus, dass der blob.

So ist es möglich, eine Datei wiederherstellen, auch wenn Sie nicht engagierten, aber es hat Hinzugefügt wurde.

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

Jetzt die blob erstellt wurde, aber es wird durch den index so wird es nicht aufgeführt werden mit git fsck, bis wir zurücksetzen.So setzen wir...

git reset --hard  
git fsck  

Sie erhalten eine dangling blob ce013625030ba8dba906f756967f9e9ca394464a

git show ce01362  

geben Sie den Inhalt der Datei "Hallo" zurück

Zu finden, die nicht referenzierte begeht, fand ich einen Tipp, irgendwo suggeriert dies.

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

Ich habe es als ein Werkzeug in git gui und es ist sehr praktisch.

Bevor Sie Antworten können hinzufügen, ein wenig hintergrund, zu erklären, was ist das HEAD.

First of all what is HEAD?

HEAD ist einfach ein Verweis auf das aktuelle commit (neueste Version) auf dem aktuellen Zweig.
Es kann nur ein einziges HEAD zu jeder gegeben Zeit.(ohne git worktree)

Der Inhalt HEAD ist gespeichert innen .git/HEAD und es enthält die 40 Byte SHA-1, der dem aktuellen commit.


detached HEAD

Wenn Sie nicht auf dem neuesten commit - was bedeutet, dass HEAD weist auf einen vorherigen commit in der Geschichte seine Namen detached HEAD.

enter image description here

In der Befehlszeile wird es so Aussehen - SHA-1 anstelle der Niederlassung name seit HEAD ist nicht zeigen auf der die Spitze des aktuellen branch

enter image description here


Ein paar Möglichkeiten auf, wie zu erholen sich von einer freistehenden LEITER:


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

Dies checkout neuen Zweig zeigte auf das gewünschte commit.
Mit diesem Befehl wird der Kaufabwicklung zu einem bestimmten Begehen.
An dieser Stelle können Sie erstellen eine Niederlassung und Arbeit zu beginnen, von diesem Punkt auf.

# 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 verwenden reflog wie gut.
git reflog angezeigt werden alle änderungen, die Aktualisierung des HEAD und Check-out die gewünschte reflog-Eintrag wird die HEAD zurück zu diesem commit.

Jedes mal, wenn der KOPF geändert wird, wird es einen neuen Eintrag in der reflog

git reflog
git checkout HEAD@{...}

Diese erhalten Sie zurück, um Ihre gewünschte commit

enter image description here


git reset HEAD --hard <commit_id>

"Verschieben" Sie Ihren Kopf wieder zurück auf die gewünschte Begehen.

# 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:(Da Git 2.7)
    Sie können auch die git rebase --no-autostash wie gut.


git revert <sha-1>

"Rückgängig machen" die angegebene commit oder commit-Bereich.
Der reset-Befehl wird der "undo" - jegliche änderungen, die in der bestimmten Begehen.
Einen neuen commit mit der undo-patch wird begangen, während die ursprüngliche commit bleibt in der Geschichte als gut.

# 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 veranschaulichen, welcher Befehl was macht.
Wie Sie dort sehen können reset && checkout ändern Sie die HEAD.

enter image description here

Ich habe habe gerade einen hard-reset auf einem falschen Projekt.Was hat mein Leben gerettet war Eclipse die lokale Geschichte.IntelliJ Idee ist sagte zu haben, zu sein, und so können Sie Ihren editor, es lohnt sich:

  1. Eclipse-Hilfe im Thema über die Lokale Geschichte
  2. http://wiki.eclipse.org/FAQ_Where_is_the_workspace_local_history_stored%3F

Aus einem kleinen Skript, um es etwas leichter zu finden, die zu Begehen man ist auf der Suche nach:

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

Ja, es kann gemacht werden deutlich hübscher aus, als mit awk oder etwas ähnliches, aber es ist einfach und ich brauchte nur Sie.Sparen kann jemand 30 Sekunden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top