问题
I have deleted all the contents inside a folder and the folder is empty. I still had a copy in my remote repo. But when I did a git pull
it didn't put back the deleted files isn't is supposed to do that?
So I did some research and saw that you can revert a file by doing
git checkout <revision> -- <name of file>
But that only works on files.
How can I retrieve all the files inside the directory?
回答1:
Everything you can do with a file, you can do with a folder too.
Also note Find and restore a deleted file in a Git repository
Files are deleted from working tree but not committed yet:
If you have not yet indexed (git add
) your changes you can revert content of a directory:
git checkout -- path/to/folder
If the deletion is already indexed, you should reset that first:
git reset -- path/to/folder
git checkout -- path/to/folder
Restore the full working tree (not a single folder), but lose all uncommitted changes
git reset --hard HEAD
When files are deleted in some commit in the past:
Find the last commit that affected the given path. As the file isn't in the HEAD commit, this commit must have deleted it.
git rev-list -n 1 HEAD -- <file_path>
Then checkout the version at the commit before, using the caret (^
) symbol:
git checkout <deleting_commit>^ -- <file_path>
Restore the full working tree from a distant commit
git reset --hard <revision>
回答2:
If you have not yet commited your changes you can revert content or a directory:
git checkout -- removed_directory
If you want to revert all changes do:
git reset --hard HEAD
回答3:
The only thing that worked for me was to checkout the repo in another folder. Assume the current repo is in /home/me/current
.
I then did
git clone /home/me/current /home/me/temp
This make a separate clone of the repo in /home/me/temp
I can now go to /home/me/temp
and do whatever I want. For example
git reset --hard commit-hash-before-delete
Now I can copy the deleted file folder back
cp -r /home/me/temp/some/deleted/folder /home/me/current/some/deleted/folder
And delete the temp folder
rm -rf /home/me/temp
The examples of
git checkout -- some/deleted/folder
git checkout -- some/deleted/folder/*
DO NOT WORK
$ git checkout -- some/deleted/folder/*
zsh: no matches found: some/deleted/folder/*
$ git checkout -- some/deleted/folder
error: pathspec 'some/deleted/folder' did not match any file(s) known to git.
Other examples like
git reset --hard HEAD
are destructive beyond just the deleted files. Any other changes will also be lost.
Similarly
git reset --hard some-commit
will lose any commits after some-commit
回答4:
If you don't specify a specific file you should be able to pull the full contents of a specific commit. Like: git checkout 264794319e9695ba843cd6
(assuming that hash has all your files at the right state).
The reason pull
isn't restoring files is that git sees your deletions as the more recent change, applying that on top of whatever you're pulling.
(I'd recommend experimenting in a new branch.)
回答5:
for uncommited deletions, Its as simple as this :
git reset HEAD rel/path/to/deleted/directory/*
来源:https://stackoverflow.com/questions/30875205/restore-a-deleted-folder-in-a-git-repo