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, чтобы избежать других проблем.

3 ответов


поскольку у вас уже есть ссылка на болтающийся объект дерева, вы хорошо на своем пути. Должно работать следующее: сначала восстановите болтающееся дерево в индекс 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 в папке Dropbox.