git удалил все, как восстановить файлы и папки
Это был первый раз, когда я использовал git, я хотел импортировать существующий проект в github, и все было удалено. После поиска ответа я думаю, что git удалил файлы после git pull, я пытаюсь восстановить файлы и папки, но не могу найти, как это сделать.
Я сделал именно следующее:
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git init
Initialized empty Git repository in /home/jesus/Escritorio/Django/Ujixy/.git/
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git add .
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: Catalogoapp/__init__.py
# new file: Catalogoapp/models.py
# new file: Catalogoapp/tests.py
# new file: Catalogoapp/views.py
# new file: Messageapp/__init__.py
# new file: Messageapp/models.py
# new file: Messageapp/tests.py
# new file: Messageapp/views.py
# new file: Ujixyapp/__init__.py
[...]
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git push origin master
fatal: 'origin' does not appear to be a git repository
fatal: The remote end hung up unexpectedly
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git add *
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to unstage)
#
# new file: Catalogoapp/__init__.py
# new file: Catalogoapp/models.py
# new file: Catalogoapp/tests.py
# new file: Catalogoapp/views.py
# new file: Messageapp/__init__.py
# new file: Messageapp/models.py
# new file: Messageapp/tests.py
# new file: Messageapp/views.py
# new file: Ujixyapp/__init__.py
[...]
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git remote add origin https://github.com/PEREYO/Ujixy.git
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git pull origin master
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
From https://github.com/PEREYO/Ujixy
* branch master -> FETCH_HEAD
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git push origin master
Username for 'https://github.com': PEREYO
Password for 'https://PEREYO@github.com':
Everything up-to-date
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git init
Reinitialized existing Git repository in /home/jesus/Escritorio/Django/Ujixy/.git/
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git add *
jesus@jesus-K52F:~/Escritorio/Django/Ujixy$ git status
# On branch master
nothing to commit (working directory clean)
Сейчас я пытаюсь это исправить, делая следующее:
jesus@jesus-K52F:~/Escritorio/Ujixy$ git fsck --lost-found
Checking object directories: 100% (256/256), done.
dangling tree bfe11a30d57a0233d3b0c840a3b66f6421987304
jesus@jesus-K52F:~/Escritorio/Ujixy$ git status
# On branch master
nothing to commit (working directory clean)
jesus@jesus-K52F:~/Escritorio/Ujixy$ git reflog
61daa69 HEAD@{0}: initial pull
jesus@jesus-K52F:~/Escritorio/Ujixy$ git cat-file -p bfe11a30d57a0233d3b0c840a3b66f6421987304
040000 tree 9196501a346cfe4347f46d82936745b78b0235b9 Catalogoapp
040000 tree 49561b4bd6adb8fe8bb1915d6bef09cd49195a97 Messageapp
040000 tree 0fb58bf9b56397443fb235e2a38045d6df7cd473 Ujixyapp
100644 blob e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 __init__.py
100644 blob dfe3388ddf2d5ba34559eb3ec56199d83cdce8bd __init__.pyc
100644 blob bcdd55e27be9447bf6b224b8ba0cbc6802509862 manage.py
100644 blob 34c5978d8026844038d530b491828398bc3ea6c7 settings.py
100644 blob 167a6b1965426ec30c25535fe27338b61b2ae0cf settings.pyc
100644 blob 4a7215cb90ae95d64ca30fde1c1277e0155eb4ed urls.py
100644 blob 6eedcddafbc8854f70f44181edac8e63781cfb09 urls.pyc
Но как я могу восстановить каталоги со всеми файлами и папками? Сейчас я работаю в папке.git, чтобы избежать других проблем.
4 ответа
Поскольку у вас уже есть ссылка на висящий древовидный объект, вы уже в пути. Должно работать следующее: сначала восстановите свисающее дерево в индексе Git:
git read-tree bfe11a30d57a0233d3b0c840a3b66f6421987304
Затем обновите ваш рабочий каталог из восстановленного индекса:
git checkout-index -a
Так как вы можете бежать git cat-file -p
на свисающем объекте дерева вы должны быть в состоянии восстановить его. Есть много способов, я опишу 2, о которых я могу быстро подумать:
Создайте новый коммит для внесения файлов в висячее дерево. Этот коммит не будет иметь родителя.
echo "A commit to recover the dangling tree." | git commit-tree bfe11a30d57a0233d3b0c840a3b66f6421987304 # Output: <SOME_NEWLY_CREATED_COMMIT_SHA1>
Новый коммит должен содержать рабочее дерево висящего дерева, которое вы только что обнаружили. Выходные данные вышеупомянутой команды должны показать новый коммит SHA1, который был создан.
Чтобы переключить текущее рабочее дерево на этот коммит:
git checkout <SOME_NEWLY_CREATED_COMMIT_SHA1>
Теперь вы сможете увидеть все файлы и содержимое, которые были перечислены в коммите висячего дерева. Вы можете просматривать, делать резервные копии файлов, делать все, что вы хотите;)
Альтернативный подход:
Если вы хотите просто внести изменения поверх вашей текущей фиксации, этот подход может быть полезен.
Считайте содержимое дерева в индекс git (т. Е. В область подготовки для этого случая).
git read-tree bfe11a30d57a0233d3b0c840a3b66f6421987304
Теперь зафиксируйте изменения в промежуточной области поверх текущей извлеченной ветви:
git commit -m "Recover the lost files."
И на будущее:
Всегда фиксируйте свои изменения, гораздо проще получить к ним доступ (используя reflogs), даже если фиксация будет зависать в будущем. Если есть сомнения, продолжайте с
git commit
вы всегда можете изменить коммит, внести изменения, переписать историю и т. д. Особенно перед запуском таких команд, какgit pull
или жеgit push
, вы должны фиксировать свои изменения, чтобы они не потерялись.Не беги
git init
дважды в хранилище, хотяgit
достаточно умен, чтобы знать, что репозиторий уже инициализирован, и пытается НЕ перезаписать ваши изменения.
Я тоже новичок в git, я пробовал
git read-tree bfe11a30d57a0233d3b0c840a3b66f6421987304
а также
git checkout-index -a
Они не работали, со временем я понял, что у моего дерева другой набор символов. Я использовал :
git fsck --lost-found
Затем я нашел значение моего дерева, чтобы применить упомянутые команды.
Я не верю, что вы можете восстановить эти файлы и папки, если вы их не зафиксировали. Git может восстановить все, что вы зафиксировали в репо, но если вы не сделали коммит в первую очередь, его вообще нет в репо. Это отчасти причина, по которой мне нравится использовать git в папке Dropbox.