Ich habe das Git-Repo some_dir_path
mit initialisiert git init
. Danach habe ich beschlossen, nicht alle Dateien in das Repo aufzunehmen und habe ausgegeben git rm -f
. Wie ich dachte, würde es alle Dateien aus dem Git-Repo entfernen, nicht aus dem Verzeichnis selbst. Und jetzt some_dir_path
ist dies leer, bis auf .git selbst:
ls -aR some_dir_path:
.git:
branches config description HEAD hooks index info objects refs
...
Die Frage ist also, ob es eine Möglichkeit gibt, die Daten wiederherzustellen.
Ich hatte keine Commits ausgegeben und keine Branches, git rm -f
aus denen ich wiederherstellen konnte.
Antwort1
Da keine der Dateien festgeschrieben wurde, sind sie nun verloren.
Wären sie begangen worden, hätten Sie sich erholt, indem Sie
git reset --hard
Dadurch wären die seit dem letzten Commit entfernten Dateien wiederhergestellt worden (und alle an anderen Dateien vorgenommenen Änderungen rückgängig gemacht worden).
Siehe auch git reset --help
.
Antwort2
Das git rm
wurde nicht festgeschrieben, daher ist das Verfahren ganz einfach:
Ausgangspunkt: Es wurde ein „Onefile“ hinzugefügt:
$ git cat-file -p HEAD:onefile
content...
$ cat onefile
content...
Jetzt die git rm
:
$ git rm -f onefile
rm 'onefile'
$ ls
Die Datei ist wirklich weg. Der Git-Befehl wird nicht übermittelt. (Die Zeile rm 'onefile'
istAusgabe, kein Befehl!)
Der Rat ist hier und jetzt einfach: Keine Panik, Überblick verschaffen:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: onefile
Folgen Sie also dem Hinweis:
$ git reset HEAD *
Unstaged changes after reset:
D onefile
Der Löschvorgang wurde von „nicht festgeschrieben“ auf „nicht bereitgestellt“ geändert.
$ git archive HEAD -o playback.tar
$ tar xf playback.tar --to-stdout
content...
Wenn die git rm
begangen wird, git reset HEAD~
ist ein erforderlich.
Wenn das Repo nach nur leer ist git init
, git rm
ist der Befehl „sicher“:
$ git rm *
fatal: pathspec '*' did not match any files
Das Q verbirgt, was zwischen init und rm vor sich ging. Muss git add gewesen sein?