git reflogist dein Freund. Suchen Sie in dieser Liste das Commit, für das Sie sich entscheiden möchten, und setzen Sie es zurück (zum Beispiel :) git reset --hard e870e41.
(Wenn Sie Ihre Änderungen nicht festgeschrieben haben ... könnten Sie in Schwierigkeiten geraten - frühzeitig und häufig festschreiben!)
Schau es dir an git log HEAD@{1}. Wenn das nach der richtigen Reihe von Commits aussieht, können Sie das git reset HEAD@{1}.
Amber
4
Nur wenn die Codes bereitgestellt werden (mit git add), werden sie in git gespeichert und können mit Befehlen wie git fsck --lost-found.
Landys
2
Ich habe versehentlich ein Commit fallen lassen, das ich beim Umbasieren hätte behalten sollen. Das hat mich total davor bewahrt, ein paar Stunden Arbeit zu wiederholen.
Josefhting
27
Das hat mir das Leben gerettet.
Lutaaya Huzaifah Idris
6
Dies rettete meine geistige Gesundheit: D
Frank Fajardo
118
Bevor wir antworten, fügen wir einige Hintergrundinformationen hinzu und erklären, was dies HEADist.
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 HEADist 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 im Verlauf verwiesen wird detached HEAD.
In der Befehlszeile sieht es folgendermaßen aus: SHA-1 anstelle des Zweignamens, da der HEADnicht auf die Spitze des aktuellen Zweigs zeigt:
Einige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:
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>
Sie können das auch immer verwenden reflog. Zeigt git reflog alle Änderungen an, durch die das aktualisiert wurde, HEADund das Auschecken des gewünschten Reflog-Eintrags setzt HEADdiesen 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
"Bewegen" Sie Ihren HEAD 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.
"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 a 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.
Das hat mir nur viele Stunden Arbeit erspart. Ich habe "git reflog --date = iso" verwendet, um das Datum / die Uhrzeit für jeden Eintrag anzuzeigen, da ich ohne den Zeitstempel nicht sicher sagen konnte.
MetalMikester
1
für mich git reset --hard <commit_id>hat das entfernen HEADfunktioniert! +1 für grafische Darstellung !!.
Reverie_ss
Nur um zu erwähnen: Wenn Sie den Filialnamen kennen: git reflog <branchname>kann sehr nützlich sein, da Sie die Änderungen nur eines Zweigs sehen.
Markus Schreiber
35
Eine andere Möglichkeit, zum gelöschten Commit zu gelangen, ist der git fsckBefehl.
git fsck --lost-found
Dies gibt ungefähr so etwas wie in der letzten Zeile aus:
dangling commit xyz
Wir können überprüfen, ob es sich um dasselbe Commit handelt, reflogwie in anderen Antworten vorgeschlagen. Jetzt können wir agit merge
git merge xyz
Hinweis:
Wir können das Commit nicht zurückerhalten, fsckwenn wir bereits einen git gcBefehl ausgeführt haben, der den Verweis auf das baumelnde Commit entfernt.
Dies ist die einzige Antwort, die funktioniert, wenn Sie nicht kürzlich auf das betreffende Commit hingewiesen haben, z. B. wenn Sie einen Zweig abrufen und diesen Zweig dann versehentlich an eine andere Stelle zurücksetzen.
Antworten:
git reflog
ist dein Freund. Suchen Sie in dieser Liste das Commit, für das Sie sich entscheiden möchten, und setzen Sie es zurück (zum Beispiel :)git reset --hard e870e41
.(Wenn Sie Ihre Änderungen nicht festgeschrieben haben ... könnten Sie in Schwierigkeiten geraten - frühzeitig und häufig festschreiben!)
quelle
git log HEAD@{1}
. Wenn das nach der richtigen Reihe von Commits aussieht, können Sie dasgit reset HEAD@{1}
.git fsck --lost-found
.Bevor wir antworten, fügen wir einige Hintergrundinformationen hinzu und erklären, was dies
HEAD
ist.First of all what is HEAD?
HEAD
ist einfach ein Verweis auf das aktuelle Commit (aktuell) in der aktuellen Verzweigung.Es kann immer nur eine einzige
HEAD
geben (ausgenommengit worktree
).Der Inhalt von
HEAD
ist darin gespeichert.git/HEAD
und enthält die 40 Bytes SHA-1 des aktuellen Commits.detached HEAD
Wenn Sie sich nicht im letzten Commit befinden, bedeutet dies, dass
HEAD
auf ein vorheriges Commit im Verlauf verwiesen wirddetached HEAD
.In der Befehlszeile sieht es folgendermaßen aus: SHA-1 anstelle des Zweignamens, da der
HEAD
nicht auf die Spitze des aktuellen Zweigs zeigt:Einige Optionen zur Wiederherstellung nach einem abgetrennten KOPF:
git checkout
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.
git reflog
Sie können das auch immer verwenden
reflog
. Zeigtgit reflog
alle Änderungen an, durch die das aktualisiert wurde,HEAD
und das Auschecken des gewünschten Reflog-Eintrags setztHEAD
diesen Commit zurück.Jedes Mal, wenn der KOPF geändert wird, wird ein neuer Eintrag in der
reflog
Dadurch kehren Sie zu Ihrem gewünschten Commit zurück
git reset --hard <commit_id>
"Bewegen" Sie Ihren HEAD zurück zum gewünschten Commit.
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.
Dieses Schema zeigt, welcher Befehl was tut.
Wie Sie dort sehen können,
reset && checkout
ändern Sie dieHEAD
.quelle
git reset --hard <commit_id>
hat das entfernenHEAD
funktioniert! +1 für grafische Darstellung !!.git reflog <branchname>
kann sehr nützlich sein, da Sie die Änderungen nur eines Zweigs sehen.Eine andere Möglichkeit, zum gelöschten Commit zu gelangen, ist der
git fsck
Befehl.Dies gibt ungefähr so etwas wie in der letzten Zeile aus:
Wir können überprüfen, ob es sich um dasselbe Commit handelt,
reflog
wie in anderen Antworten vorgeschlagen. Jetzt können wir agit merge
Hinweis:
Wir können das Commit nicht zurückerhalten,
fsck
wenn wir bereits einengit gc
Befehl ausgeführt haben, der den Verweis auf das baumelnde Commit entfernt.quelle