Отмените 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 не может выяснить, на какой коммит вы ссылаетесь, так как его нет.