git deleted everything, how to recover files and f

2020-03-18 06:49发布

问题:

It was the first time that I was using git, I wanted to import an existing project into github and everything was deleted. After search for an answer I think git deleted the files after git pull, I'm trying to recover the files and folders but I can't find how to do it.

I did exactly the next:

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)

Now I'm trying to fix it doing the next:

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

But, How can I recover the directories with all the files and folder? Now I'm working in a copy of .git folder to avoid another problems.

回答1:

As you already have a reference to a dangling tree object, you're well on your way. The following should work: first recover the dangling tree into Git's index:

git read-tree bfe11a30d57a0233d3b0c840a3b66f6421987304

Next, update your working directory from the now-recovered index:

git checkout-index -a


回答2:

Since you've able to run git cat-file -p on the dangling tree object, you should be able to recover it. There are many ways about it, I shall describe 2 that I can quickly think of:

  • Create a new commit to bring-in the files in the dangling tree. This commit will have no parent.

    echo "A commit to recover the dangling tree." | git commit-tree bfe11a30d57a0233d3b0c840a3b66f6421987304
    
    # Output:
    <SOME_NEWLY_CREATED_COMMIT_SHA1>
    

    The new commit should contain the work-tree of the dangling tree that you just found out. The output of the above command should show the new commit SHA1 which was created.

    To switch your current work-tree to this commit:

    git checkout <SOME_NEWLY_CREATED_COMMIT_SHA1>
    

    Now you should be able to see all the files and the contents that were listed in the dangling tree commit. You can browse around, make a backup of the files, do whatever you want ;)

  • Alternative approach:

    If you would like to just get the changes on top of your current commit, this approach might be useful.

    Read the contents of the tree into git's index (i.e. into the staging area for this case).

    git read-tree bfe11a30d57a0233d3b0c840a3b66f6421987304
    

    Now commit the changes in the staging area on top of the currently checked out branch:

    git commit -m "Recover the lost files."
    

And for the future:

  • Always commit your changes, it is much easier to get to them (using reflogs) even if the commit gets dangling in the future. When in doubt go ahead with a git commit, you can always ammend the commit, make changes, rewrite history, etc. Especially before running commands like git pull or git push, you should be committing your changes so that they do not get lost.

  • Do not run git init twice on a repository, although git is smart enough to know that the repo has already been initialized and tries NOT to overwrite your changes.



回答3:

I don't believe you can recover those files and folders if you haven't committed them in the first place. Git can recover anything that you have committed into the repo, but if you didn't commit in the first place, it is not within the repo at all. This is partly the reason why I like to use git within a Dropbox folder.