Отмените git rm -r f (неоднозначный аргумент 'HEAD') перед первым коммитом

Я сделал git rm -r -f на ВЕСЬ каталог в новом репо, прежде чем я когда-либо совершил. У меня не было ветвей.

Я попробовал ответы на Stack Overflow, но никто не помог. Я попробовал это:

git reset --hard HEAD

Но получил это:

fatal: ambiguous argument 'HEAD': unknown revision or path not in the working tree.

Можно ли как-нибудь вернуть файлы обратно?

2 ответа

На самом деле, вы можете восстановить файлы.

Причина в том, что git rm -r удалит только те файлы, которые есть в индексе, поэтому для того, чтобы он удалил материал, вы должны уже git add эти файлы. Когда вы это сделали, git поместил копию содержимого каждого файла в репозиторий, используя "истинное имя" SHA-1 для содержимого BLOB-объекта.

Если вы сейчас бежите git fsck --lost-found, git найдет объекты, которые не имеют ссылки (то есть все объекты в хранилище) и напечатает dangling <type> <SHA-1>, Для каждого "блоба" (в данном случае всего, что он находит) он записывает содержимое в .git/lost-found/other/ под названием SHA-1:

$ git rm -r -f .
rm 'bar'
$ git fsck --lost-found
notice: HEAD points to an unborn branch (master)
Checking object directories: 100% (256/256), done.
notice: No default references
dangling blob f53433f357a56ddb698196519f30eb390ae684cb
$ cat .git/lost-found/other/f53433f357a56ddb698196519f30eb390ae684cb 
this is file bar
$

Это также работает для репозиториев, которые имеют некоторые коммиты и является общим методом для "восстановления материалов, которые раньше имели ссылку, но больше не имеют". Это найдет файлы, которые вы git add редактировать, а затем заменить новым содержимым, которое вы git add Эд "на вершине" старого раньше git commit ING. Он также найдет любые "заброшенные" коммиты, в том числе упавшие git stashes. (Коммиты идут в .git/lost-found/commit/.)

В приведенном выше примере файл bar удобно утверждает, что файл bar в его содержании. В большинстве реальных случаев вам нужно посмотреть на каждый найденный блоб и угадать его оригинальное имя.

Поскольку вы удалили данные до того, как сделали какие-либо коммиты, вы потеряли их.

git reset --hard не работает, потому что у вас нет первоначального коммита для сброса тоже. Следовательно, ошибка "неоднозначный аргумент", git не может выяснить, на какой коммит вы ссылаетесь, так как его нет.

Другие вопросы по тегам