Stellen Sie einen gelöschten Ordner in einem Git-Repo wieder her

94

Ich habe den gesamten Inhalt eines Ordners gelöscht und der Ordner ist leer. Ich hatte noch eine Kopie in meinem Remote-Repo. Aber als ich ein gemacht habe, hat git pulles die gelöschten Dateien nicht zurückgesetzt, soll das nicht?

Also habe ich einige Nachforschungen angestellt und festgestellt, dass Sie eine Datei dadurch zurücksetzen können git checkout <revision> -- <name of file>

Das funktioniert aber nur bei Dateien.

Wie kann ich alle Dateien im Verzeichnis abrufen?

json2021
quelle
1
git statusgibt Ihnen einen Hinweis darauf, welche Befehle ausgeführt werden sollen
Tavian Barnes
1
Es hört sich so an, als hätten Sie immer noch das alte Verzeichnis in Ihrem Remote-Repo (und möglicherweise sogar in Ihrem lokalen Repo). STARKER VORSCHLAG: 1) Ziehen Sie von Ihrem Remote-Repo in ein NEUES Repo (fügen Sie Ihrem lokalen Repo keinen Schaden mehr zu). 2) Versuchen Sie "checkout" ... oder "revert" in Ihrem neuen lokalen Repo: atlassian.com/git/tutorials/undoing-changes/git-revert . 3) Aktualisieren Sie das Remote-Repo, wenn Sie sicher sind, dass alles in Ordnung ist.
Pauls4

Antworten:

239

Alles, was Sie mit einer Datei tun können, können Sie auch mit einem Ordner tun.

Beachten Sie auch, dass Sie eine gelöschte Datei in einem Git-Repository suchen und wiederherstellen können


Dateien werden aus dem Arbeitsbaum gelöscht, aber noch nicht festgeschrieben:

Wenn Sie git addIhre Änderungen noch nicht indiziert ( ) haben, können Sie den Inhalt eines Verzeichnisses zurücksetzen:

git checkout -- path/to/folder

Wenn der Löschvorgang bereits indiziert ist, sollten Sie diesen zuerst zurücksetzen:

git reset -- path/to/folder
git checkout -- path/to/folder


Stellen Sie den vollständigen Arbeitsbaum (keinen einzelnen Ordner) wieder her, verlieren Sie jedoch alle nicht festgeschriebenen Änderungen

git reset --hard HEAD


Wenn Dateien in der Vergangenheit in einem Commit gelöscht wurden:

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.

git rev-list -n 1 HEAD -- <file_path>

Überprüfen Sie dann die Version beim Festschreiben zuvor mit dem ^Symbol caret ( ):

git checkout <deleting_commit>^ -- <file_path>


Stellen Sie den vollständigen Arbeitsbaum aus einem entfernten Commit wieder her

git reset --hard <revision> 
Nick Volynkin
quelle
1
git checkout -- path/to/folder/* funktioniert nicht Hinweis: Die Frage ist, wie man einen Ordner wiederherstellt, keine Datei
gman
@gman How can I retrieve all the files inside the directorybedeutet sowohl das Verzeichnis als auch seine Dateien. Aber der Befehl funktioniert überraschenderweise auch bei mir nicht. Ich erinnere mich, dass es vor einem Jahr geschah.
Nick Volynkin
2
@gman aber es funktioniert wie git checkout -- pathoder git checkout -- 'path/*'. In Ihrem Beispiel löschen Sie, mit git rmdem das OP nicht zu tun schien. Ich habe Anweisungen für einen solchen Fall hinzugefügt. Vielen Dank!
Nick Volynkin
3
Unter Windows müssen Sie folgende Anführungszeichen setzen:git checkout "<deleting_commit>^" -- <file_path>
Maor
Es hat eine Reihe von Dingen im gesamten Repo freigegeben, obwohl ich im Befehl reset einen Ordner angegeben habe. Wie macht das Sinn? Als ich die Kasse ausführte, sah es so aus, als hätte es meinen Ordner wiederhergestellt. Ich habe keine Ahnung, was Unstage mit dem Rest meines Codes gemacht hat. Ah, die Freuden eines Peer-to-Peer-Repository-Managers, der für zentralisierte Repos verwendet wird, seufz.
Paul Kenjora
5

Wenn Sie Ihre Änderungen noch nicht festgeschrieben haben, können Sie Inhalte oder ein Verzeichnis zurücksetzen:

git checkout -- removed_directory

Wenn Sie alle Änderungen rückgängig machen möchten, gehen Sie wie folgt vor:

git reset --hard HEAD
Ivan Mushketyk
quelle
3
git checkout -- removed_directory funktioniert nicht
gman
git checkout -- removed_directoryhat für mich funktioniert, aber ich habe dieses Verzeichnis schon einmal erstellt (durch checkouteine der Dateien in diesem Verzeichnis). Nach der Erstellung wurden alle Dateien mit diesem Befehl im Ordner wiederhergestellt.
Boolean_Type
3

Das einzige, was für mich funktioniert hat, war das Auschecken des Repos in einem anderen Ordner. Angenommen, das aktuelle Repo ist in /home/me/current.

Ich habe es dann getan

git clone /home/me/current /home/me/temp

Dadurch wird ein separater Klon des Repos erstellt /home/me/temp

Ich kann jetzt gehen /home/me/tempund tun, was ich will. Beispielsweise

git reset --hard commit-hash-before-delete

Jetzt kann ich den gelöschten Dateiordner zurück kopieren

cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder

Und löschen Sie den temporären Ordner

rm -rf /home/me/temp

Die Beispiele von

git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*

ARBEITE NICHT

$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.

Andere Beispiele wie

git reset --hard HEAD

sind über die gelöschten Dateien hinaus destruktiv. Alle anderen Änderungen gehen ebenfalls verloren.

Ähnlich

git reset --hard some-commit

wird alle Commits nach verlieren some-commit

gman
quelle
2

Ab Git 2.24.0 gibt es einen experimentellen neuen git-Befehl: git restore

git restore --staged some/deleted/folder
iethree
quelle
Es zeigt mir git: 'restore' ist kein git-Befehl
Ahmed C
2

Sie können Dateien oder Ordner mit git restore wiederherstellen.

git restore --source master~1 "PATH_IN_YOUR_REPO"

Hier setzt master ~ 1 Ihren Ordner von Ihrem Master-Zweig auf "1" zurück.

Quelle: https://git-scm.com/docs/git-restore

jBelanger
quelle
0

Wenn Sie keine bestimmte Datei angeben, sollten Sie in der Lage sein, den vollständigen Inhalt eines bestimmten Commits abzurufen. Wie: git checkout 264794319e9695ba843cd6(vorausgesetzt, Hash hat alle Ihre Dateien im richtigen Zustand).

Der Grund, warum pullDateien nicht wiederhergestellt werden, ist, dass Git Ihre Löschungen als die jüngste Änderung ansieht und diese zusätzlich zu dem anwendet, was Sie abrufen.

(Ich würde empfehlen, in einem neuen Zweig zu experimentieren.)

verlorener Philosoph
quelle
-1

Für nicht festgeschriebene Löschungen ist es so einfach:

git reset HEAD rel / path / to / deleted / directory / *

justadev
quelle