Angenommen, ich bin in einem Git-Repository. Ich lösche eine Datei und schreibe diese Änderung fest. Ich arbeite weiter und mache weitere Verpflichtungen. Dann muss ich diese Datei wiederherstellen.
Ich weiß, dass ich eine Datei mit auschecken kann git checkout HEAD^ foo.bar
, aber ich weiß nicht wirklich, wann diese Datei gelöscht wurde.
- Was wäre der schnellste Weg, um das Commit zu finden, mit dem ein bestimmter Dateiname gelöscht wurde?
- Was wäre der einfachste Weg, um diese Datei wieder in meine Arbeitskopie aufzunehmen?
Ich hoffe, ich muss meine Protokolle nicht manuell durchsuchen, das gesamte Projekt für eine bestimmte SHA auschecken und diese Datei dann manuell in meine ursprüngliche Projektkasse kopieren.
git
file-io
git-checkout
avdgaag
quelle
quelle
git log --diff-filter=D -- path/to/file
git checkout deletedFile
wird wiederhergestellt,deletedFile
wenn es gelöscht wurde, aber dieses Löschen noch nicht bereitgestellt oder festgeschrieben wurde . Darum geht es hier nicht; In dieser Frage geht es darum, wie eine Datei wiederhergestellt werden kann, deren Löschung vor vielen Commits festgeschrieben wurde.Antworten:
Suchen Sie das letzte Commit, das den angegebenen Pfad beeinflusst hat. Da sich die Datei nicht im HEAD-Commit befindet, muss sie durch dieses Commit gelöscht worden sein.
Überprüfen Sie dann die Version beim Festschreiben zuvor mit dem
^
Symbol caret ( ):Oder in einem Befehl, ob
$file
es sich um die betreffende Datei handelt.Wenn Sie zsh verwenden und die Option EXTENDED_GLOB aktiviert haben, funktioniert das Caret-Symbol nicht. Sie können
~1
stattdessen verwenden.quelle
± git checkout $(git rev-list -n 1 HEAD "spec/Sporkfile_example.rb")^ -- "spec/Sporkfile_example.rb" zsh: no matches found: b71c152d8f38dcd23ad7600a93f261a7252c59e9^
Ich wechselte zu Bash und es funktionierte aber gut.error: pathspec <filename> did not match any file(s) known to git.
. Die Lösung bestand darin, Git Bash zu verwenden.git checkout <deleting-commit>~1 -- <file-path>
~ X ermöglicht es Ihnen, X-Commits vor dem angegebenen Commit anzugeben, also ist ~ 1 das Commit vor ~ 2 ist zwei Commits vor, etc^
Zeichen das Escape-Zeichen! Daher müssen Sie auf cmd eingeben,^^
um cmd mitzuteilen, dass Sie ein einzelnes Literal ^ möchten und dass Sie danach nicht mehr etwas anderem entkommen. Was vielen Menschen passiert, ist, dass auf das^
ein Leerzeichen folgt. Cmd glaubt also, dass Sie dem Raum entkommen - was einfach einen Raumcharakter ergibt. Wenn Git also die Cli-Argumente erhält, sieht esSHA1
und nichtSHA1^
. Es ist wirklich nervig.~
ist kein Fluchtcharakter, deshalb funktioniert das immer noch. (PS. Wenn Sie glauben, dass Googler diese Informationen wollen, stimmen Sie diesen Kommentar bitte ab)git log --diff-filter=D --summary
diese Option , um alle Commits abzurufen, bei denen Dateien gelöscht und die Dateien gelöscht wurden.git checkout $commit~1 path/to/file.ext
diese Option , um die gelöschte Datei wiederherzustellen.Wo
$commit
ist der Wert des Commits, den Sie in Schritt 1 gefunden haben, ze4cf499627
quelle
git log -- *PartOfMyFileName*
. Vielen Dank für die$commit~1
git checkout $commit~1 filename
Syntax funktioniert perfekt für einzelne Dateien und auch für ganze Verzeichnisse. dh: um alle gelöschten Bilder in ./images von sha 12345 wiederherzustellen :git checkout 12345~1 images
. danke für diese antwort!$commit~1
bedeutet, dass Sie den Namen des Commits hinzufügen sollten. So etwas wie1d0c9ef6eb4e39488490543570c31c2ff594426c
wo$commit
ist.Geben Sie den folgenden Befehl ein, um alle gelöschten Dateien in einem Ordner wiederherzustellen.
quelle
git
selbst die einfachste Aufgabe gemacht hat.ls-files
Unterbefehl ist praktisch, scheint aber nicht für Dateien zu funktionieren, die mitgit rm
dh inszeniert, geschweige denn festgeschrieben wurden, was das OP verlangt hat.M myChangedFile
nachgit checkout
?Ich bin auf diese Frage gekommen, um eine Datei wiederherzustellen, die ich gerade gelöscht habe, aber die Änderung noch nicht übernommen habe. Für den Fall, dass Sie sich in dieser Situation befinden, müssen Sie lediglich Folgendes tun:
git checkout HEAD -- path/to/file.ext
quelle
Wenn Sie verrückt sind, verwenden Sie
git-bisect
. Folgendes ist zu tun:Jetzt ist es Zeit, den automatisierten Test durchzuführen. Der Shell-Befehl
'[ -e foo.bar ]'
gibt 0 zurück, fallsfoo.bar
vorhanden, andernfalls 1. Der Befehl "run" vongit-bisect
verwendet die binäre Suche, um automatisch das erste Commit zu finden, bei dem der Test fehlschlägt. Es beginnt in der Mitte des angegebenen Bereichs (von gut bis schlecht) und halbiert ihn basierend auf dem Ergebnis des angegebenen Tests.Jetzt sind Sie beim Commit, das es gelöscht hat. Von hier aus können Sie in die Zukunft zurückspringen und
git-revert
die Änderung rückgängig machen.oder Sie können ein Commit zurückgehen und den Schaden manuell untersuchen:
quelle
git bisect run '[ -e foo.bar ]'
?git bisect run
weist Git an, die Halbierung zu automatisieren, indem der Befehl nach dem Wort 'run' ausgeführt wird, wobei der Befehl0
für einegood
Version zurückgegeben werden muss (git help bisect
Einzelheiten siehe ). Das'[ -e foo.bar ]'
ist ein Standardausdruck für die Prüfung , ob die Dateifoo.bar
tut existiert (die Umsetzung ist in die Regel in der Datei/usr/bin/[
der in der Regel zu hardlinked/usr/bin/test
) und die einzelnen quation Marken eingesetzt , die alle als ein einziges Befehlszeilenargument zu setzen.Mein neues Lieblings alias, basierend auf bonyiii ‚s Antwort (upvoted) und meine eigene Antwort über‚ Übergeben Sie ein Argument für ein Git - Alias - Befehl ‘:
Ich habe eine Datei verloren, die vor einigen Commits versehentlich gelöscht wurde.
Schnell:
Krise abgewendet.
Achtung, mit Git 2.23 (Q3 2019) kommt der experimentelle Befehl mit dem Namen
git restore
(!).Benennen Sie diesen Alias um (wie unten gezeigt).
Robert Dailey schlägt in den Kommentaren den folgenden Alias vor:
Und Jegan fügt in den Kommentaren hinzu :
quelle
restore-file = !git checkout $(git rev-list -n 1 HEAD -- "$1")^ -- "$1"
git config --global alias.restore "\!git checkout \$(git rev-list -n 1 HEAD -- \"\$1\")^ -- \"\$1\""
Expansion of alias 'restore' failed; '!git' is not a git command
Wenn Sie den Dateinamen kennen, ist dies mit einfachen Befehlen ein einfacher Weg:
Listen Sie alle Commits für diese Datei auf.
Das letzte Commit (oberstes) hat die Datei gelöscht. Sie müssen also das vorletzte Commit wiederherstellen.
quelle
So stellen Sie eine gelöschte und festgeschriebene Datei wieder her:
Es wurde auf Git Version 1.7.5.4 getestet.
quelle
error: pathspec 'foo' did not match any file(s) known to git.
mich vergewissert, dass der Dateiname korrekt ist. Git Version 2.7.0git add -A
, aber die wiederhergestellte Datei befand sich noch in einem nicht festgeschriebenen Stadium.Wenn Sie nur Änderungen vorgenommen und eine Datei gelöscht, aber nicht festgeschrieben haben, haben Sie jetzt mit Ihren Änderungen Schluss gemacht
Ihre gelöschten Dateien wurden jedoch nicht zurückgegeben. Führen Sie einfach den folgenden Befehl aus:
Und schon ist Ihre Datei zurück.
quelle
Ich habe diese Lösung .
Rufen Sie die ID des Commits ab, bei dem die Datei auf eine der folgenden Arten gelöscht wurde.
git log --grep=*word*
git log -Sword
git log | grep --context=5 *word*
git log --stat | grep --context=5 *word*
# empfohlen, wenn Sie sich kaum an etwas erinnernSie sollten etwas bekommen wie:
3 . Verwenden Sie jetzt die Festschreibungs-ID bfe68bd117e1091c96d2976c99b3bcc8310bebe7, um:
Da die Commit-ID auf das Commit verweist, bei dem die Datei bereits gelöscht wurde, müssen Sie kurz vor bfe68b auf das Commit verweisen, was Sie durch Anhängen tun können
^1
. Dies bedeutet: Geben Sie mir das Commit kurz vor bfe68b.quelle
quelle
git undelete path/to/file.ext
Fügen Sie dies in Ihre
.bash_profile
(oder eine andere relevante Datei ein, die beim Öffnen einer Befehlsshell geladen wird):Dann benutze:
Dieser Alias überprüft zuerst, ob das letzte Commit gefunden wurde, in dem diese Datei vorhanden war, und führt dann eine Git-Überprüfung dieses Dateipfads von dem letzten Commit durch, in dem diese Datei vorhanden war. Quelle .
quelle
In vielen Fällen kann es nützlich sein, Coreutils (grep, sed usw.) in Verbindung mit Git zu verwenden. Ich kenne diese Tools bereits recht gut, Git weniger. Wenn ich nach einer gelöschten Datei suchen möchte, würde ich Folgendes tun:
Wenn ich die Revision / Commit finde:
Genau wie andere vor mir gesagt haben.
Die Datei wird nun in dem Zustand wiederhergestellt, den sie vor dem Entfernen hatte. Denken Sie daran, es erneut in den Arbeitsbaum zu übernehmen, wenn Sie es behalten möchten.
quelle
Ich musste eine Reihe gelöschter Dateien aus einem bestimmten Commit wiederherstellen und habe es mit zwei Befehlen verwaltet:
(Beachten Sie das Leerzeichen am Ende jedes Befehls.)
Die Dateien wurden der Gitignore-Datei hinzugefügt und dann mit gelöscht
git rm
. Ich musste die Dateien wiederherstellen, sie dann aber entfernen. Ich musste Hunderte von Dateien wiederherstellen, und die manuelle Eingabe für jede Datei wie in den anderen Beispielen würde viel zu langsam sein.quelle
Eigentlich geht es bei dieser Frage direkt um Git, aber jemand wie ich arbeitet mit GUI-Tools wie dem WebStorm VCS, außer mit Git CLI-Befehlen.
Ich klicke mit der rechten Maustaste auf den Pfad, der die gelöschte Datei enthält, gehe dann zu Git und klicke dann auf Verlauf anzeigen .
Die VCS-Tools zeigen alle Revisionen an und ich kann alle Commits und Änderungen von jedem von ihnen sehen.
Dann wähle ich die Commits aus, mit denen mein Freund die
PostAd.js
Datei löscht . jetzt siehe unten:Und jetzt kann ich meinen Wunsch gelöschte Datei sehen. Ich doppelklicke einfach auf den Dateinamen und er wird wiederhergestellt.
Ich weiß, dass meine Antwort keine Git-Befehle sind, aber sie ist schnell, zuverlässig und einfach für Anfänger und professionelle Entwickler. WebStorm VCS-Tools sind fantastisch und perfekt für die Arbeit mit Git und es werden keine anderen Plugins oder Tools benötigt.
quelle
Ich hatte die gleiche Frage. Ohne es zu wissen, hatte ich ein baumelndes Commit erstellt .
Liste baumelnde Commits
git fsck --lost-found
Überprüfen Sie jedes baumelnde Commit
git reset --hard <commit id>
Meine Dateien wurden wieder angezeigt, als ich zum Dangling Commit wechselte.
git status
aus dem Grund:“HEAD detached from <commit id where it detached>”
quelle
Stellen Sie die gelöschte Datei wieder her:
quelle
Wenn Sie das Commit kennen, mit dem die Datei (en) gelöscht wurden, führen Sie diesen Befehl aus. Dabei
<SHA1_deletion>
handelt es sich um das Commit, mit dem die Datei gelöscht wurde:Der Teil vor der Pipe listet alle Dateien auf, die im Commit gelöscht wurden. Sie sind alle aus dem vorherigen Commit ausgecheckt, um sie wiederherzustellen.
quelle
Suchen Sie das Commit, mit dem Ihre Datei gelöscht wurde:
Beispielausgabe:
Ab Git 2.23 gibt es tatsächlich einen
restore
Befehl. Es ist noch experimentell, aber um etwas wiederherzustellen, das Sie in einem Commit entfernt haben (in diesem Fall 4711174), können Sie Folgendes eingeben:Beachten Sie die ^ nach der Commit - ID , wie wir etwas wiederherstellen möchten aus dem Commit vor demjenigen der die Datei gelöscht hat.
Das
--source
Argument teilt demrestore
Befehl mit, wo nach den wiederherzustellenden Dateien gesucht werden soll, und es kann sich um ein beliebiges Commit und sogar um den Index handeln.Siehe: git-restore doc für git 2.23.0
quelle
In unserem Fall haben wir versehentlich Dateien in einem Commit gelöscht und einige Commits später haben wir unseren Fehler erkannt und wollten alle gelöschten Dateien zurückbekommen, aber nicht diejenigen, die geändert wurden.
Basierend auf Charles Baileys hervorragender Antwort ist hier mein Einzeiler:
quelle
Einfach und präzise
Holen Sie sich zunächst ein aktuelles stabiles Commit, in dem Sie diese Datei haben, indem Sie -
Angenommen, Sie finden $ commitid 1234567 ... dann
Dadurch wird die Dateiversion wiederhergestellt, die sich in diesem Commit befand.
quelle
Probieren Sie es aus, um den besten Weg zu finden.
Suchen Sie zunächst die Commit-ID des Commits, das Ihre Datei gelöscht hat. Sie erhalten eine Zusammenfassung der Commits, mit denen Dateien gelöscht wurden.
Hinweis:
84sdhfddbddd
ist deincommit id
Auf diese Weise können Sie alle gelöschten Dateien einfach wiederherstellen.
quelle
Sie könnten immer
git revert
Ihr Commit, das die Datei gelöscht hat. ( Dies setzt voraus, dass das Löschen die einzige Änderung im Commit war. )Wenn Sie die Arbeit fortgesetzt haben und später festgestellt haben, dass Sie dieses Lösch-Commit nicht festschreiben möchten, können Sie es mit folgenden Schritten zurücksetzen:
Jetzt
git log
zeigt:Und
readme.md
wurde im Repository wiederhergestellt.quelle
Ich habe auch dieses Problem mit dem folgenden Code, um eine vorherige Datei in ein lokales Verzeichnis abzurufen:
Das folgende Beispiel funktioniert für mich:
git checkout resources/views/usaSchools.blade.php
quelle
quelle
Wenn das Löschen nicht festgeschrieben wurde, stellt der folgende Befehl die gelöschte Datei im Arbeitsbaum wieder her.
Mit dem folgenden Befehl können Sie eine Liste aller gelöschten Dateien im Arbeitsbaum abrufen.
Wenn das Löschen festgeschrieben wurde, suchen Sie das Festschreiben dort, wo es stattgefunden hat, und stellen Sie die Datei aus diesem Festschreiben wieder her.
Wenn Sie nach dem Pfad der wiederherzustellenden Datei suchen, zeigt der folgende Befehl eine Zusammenfassung aller gelöschten Dateien an.
quelle
Um alle gelöschten Dateien mit Git wiederherzustellen, haben Sie auch folgende Möglichkeiten:
Wobei
git ls-files --deleted
alle gelöschten Dateien aufgelistet undgit checkout $(git command)
die Liste der Dateien in einem Parameter wiederhergestellt wird.quelle