Как отменить git rm -rf dirname без первого коммита? - PullRequest
10 голосов
/ 10 марта 2012

Я сделал:

git init
git add .
git rm -rf dirname

Глядя на другие ответы, git reset --hard HEAD, git checkout -f и git reflog не сработали, по-видимому, потому что нет HEAD для возврата или фиксацииполучить файлы обратно.

Есть ли способ получить файлы обратно?

Ответы [ 5 ]

8 голосов
/ 10 марта 2012

Нет пути.

Обычно git rm проверяет, что файлы уже были зафиксированы перед их удалением, чтобы вы не потеряли свою работу. Однако использование -f отменяет эту проверку.

Короче говоря:

  • Не используйте -f.
  • Не трогай ничего, что ты не совершал.
3 голосов
/ 14 ноября 2017

Предупреждение : Запуск git prune без опции -n (1) сотрет ваши недоступные данные.

Может быть способ, используя git prune и git cat-file.

Запуск git prune -n покажет, какие объекты будут удалены путем сокращения:

$ git prune -n
9cc84ea9b4d95453215d0c26489d6a78694e0bc6 blob
c315143703752ef4d11ca7d93f2c324872b2ebff blob

Каждая строкасоответствует удаленному файлу.

Теперь, используя git cat-file, мы можем восстановить содержимое удаленного файла в новый файл:

git cat-file -p 9cc84ea9b4d95453215d0c26489d6a78694e0bc6 > restored-filename.whatever

(1)Из git prune документов:

ИМЯgit-prune - удаляет все недоступные объекты из базы данных объектов.ОПЦИИ-n--пробный прогонНе удаляйте ничего;просто сообщите, что он удалит.

1 голос
/ 04 декабря 2015

git reset --hard помогло, когда удаление еще не было завершено, и, вообще говоря, удаление было прервано Ctrl+Z

1 голос
/ 10 марта 2012

Нет, насколько я знаю.Я считаю, что git отменяет связь с файлами, как это делает rm -rf.Не имеет значения, знает ли он о файлах или нет, он с радостью уничтожит каталог.На самом деле, ваш единственный выход - попытаться использовать инструмент восстановления файлов, как если бы вы сделали сделано rm -rf

0 голосов
/ 10 марта 2012

Если git не отслеживает каталог dirname, он не позволит вам удалить каталог с git rm -rf, так как он не знает об этом.Вы получите (получите) ошибку типа

fatal: pathspec 'dirname' did not match any files

Единственный способ, которым вы могли бы удалить, - это если вы сделали git add . или git add dirname после git init.Если это так, ваши файлы исчезли, и вы не можете получить их обратно, так как они никогда не передавались, и git не отслеживает их.Это так же хорошо, как делать rm -rf в обычной папке (и не может восстановиться, если у вас нет резервных копий)

...