Я инициализировал git repo some_dir_path
с помощью git init
. После этого я решил не включать все файлы в repo и выполнил git rm -f
. Как я и думал, это удалит все файлы из git repo, а не из самого каталога. И теперь это some_dir_path
пусто, за исключением самого .git:
ls -aR some_dir_path:
.git:
branches config description HEAD hooks index info objects refs
...
Итак, вопрос в том, есть ли способ вернуть данные?
У меня не было никаких коммитов и веток, git rm -f
из которых можно было бы восстановиться.
решение1
Поскольку ни один из файлов не был передан, они теперь утеряны.
Если бы они были совершены, вы бы оправились, выпустив
git reset --hard
Это восстановило бы удаленные файлы (и отменило бы все изменения, внесенные в другие файлы) с момента последнего коммита.
Смотрите также git reset --help
.
решение2
Поскольку транзакция git rm
не была совершена, процедура довольно проста:
Начальная точка: добавлен «onefile»:
$ git cat-file -p HEAD:onefile
content...
$ cat onefile
content...
Сейчас git rm
:
$ git rm -f onefile
rm 'onefile'
$ ls
Файл действительно пропал. Команда git не зафиксирована. ( rm 'onefile'
Строкавыход, а не приказ!)
Совет прост здесь и сейчас: не паникуйте, получите общее представление:
$ git status
On branch master
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
deleted: onefile
Итак, следуя подсказке:
$ git reset HEAD *
Unstaged changes after reset:
D onefile
Удаление перешло из категории «незавершённое» в категорию «неподготовленное».
$ git archive HEAD -o playback.tar
$ tar xf playback.tar --to-stdout
content...
Если git rm
будет совершено, то git reset HEAD~
потребуется а.
Если после всего этого репозиторий пуст git init
, git rm
команда «безопасна»:
$ git rm *
fatal: pathspec '*' did not match any files
Q скрывает то, что произошло между init и rm. Должно быть, это было git add?