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


person PEREYO    schedule 07.05.2013    source источник


Ответы (3)


Поскольку у вас уже есть ссылка на висящий объект дерева, вы на правильном пути. Следующее должно работать: сначала восстановите висящее дерево в индексе Git:

git read-tree bfe11a30d57a0233d3b0c840a3b66f6421987304

Затем обновите свой рабочий каталог из восстановленного индекса:

git checkout-index -a
person earl    schedule 07.05.2013
comment
Спас мой день. Спасибо. - person user2085689; 06.03.2014
comment
То же самое, дружище ... Ура! - person Dzeimsas Zvirblis; 23.07.2015

Поскольку вы можете запустить git cat-file -p для объекта висящего дерева, вы сможете восстановить его. Есть много способов, которые я могу быстро придумать, я опишу два:

  • Создайте новую фиксацию, чтобы добавить файлы в висящее дерево. У этого коммита не будет родителя.

    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."
    

И на будущее:

  • Всегда фиксируйте свои изменения, гораздо проще добраться до них (с помощью рефлогов), даже если в будущем фиксация будет зависать. Если есть сомнения, используйте git commit, вы всегда можете исправить фиксацию, внести изменения, переписать историю и т. Д. Особенно перед запуском таких команд, как git pull или git push, вы должны зафиксировать свои изменения, чтобы они не потерялись.

  • Не запускайте git init дважды в репозитории, хотя git достаточно умен, чтобы знать, что репо уже было инициализировано, и НЕ пытается перезаписать ваши изменения.

person Tuxdude    schedule 07.05.2013

Я не верю, что вы сможете восстановить эти файлы и папки, если вы их не зафиксировали. Git может восстановить все, что вы зафиксировали в репо, но если вы не зафиксировали его изначально, этого вообще нет в репо. Отчасти это причина, по которой мне нравится использовать git в папке Dropbox.

person Stunner    schedule 07.05.2013