Wiederherstellen nach „git rm“

Wiederherstellen nach „git rm“

Ich habe das Git-Repo some_dir_pathmit 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_pathist 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 -faus 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 rmwurde 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 rmbegangen wird, git reset HEAD~ist ein erforderlich.

Wenn das Repo nach nur leer ist git init, git rmist 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?

verwandte Informationen