The best answers to the question “How to find and restore a deleted file in a Git repository” in the category Dev.
Say I’m in a Git repository. I delete a file and commit that change. I continue working and make some more commits. Then, I find I need to restore that file.
I know I can checkout a file using
git checkout HEAD^ foo.bar, but I don’t really know when that file was deleted.
- What would be the quickest way to find the commit that deleted a given filename?
- What would be the easiest way to get that file back into my working copy?
I’m hoping I don’t have to manually browse my logs, checkout the entire project for a given SHA and then manually copy that file into my original project checkout.
git log --diff-filter=D --summaryto get all the commits which have deleted files and the files deleted;
git checkout $commit~1 path/to/file.extto restore the deleted file.
$commit is the value of the commit you’ve found at step 1, e.g.
Find the last commit that affected the given path. As the file isn’t in the HEAD commit, that previous commit must have deleted it.
git rev-list -n 1 HEAD -- <file_path>
Then checkout the version at the commit before, using the caret (
git checkout <deleting_commit>^ -- <file_path>
Or in one command, if
$file is the file in question.
git checkout $(git rev-list -n 1 HEAD -- "$file")^ -- "$file"
If you are using zsh and have the EXTENDED_GLOB option enabled, the caret symbol won’t work. You can use
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
I came to this question looking to restore a file I just deleted but I hadn’t yet committed the change. Just in case you find yourself in this situation, all you need to do is the following:
git checkout HEAD -- path/to/file.ext
To restore all those deleted files in a folder, enter the following command.
git ls-files -d | xargs git checkout --