How to find and restore a deleted file in a Git repository
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 (^
) symbol:
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 ~1
instead.
git checkout $(git rev-list -n 1 HEAD -- "$file")~1 -- "$file"
Get all the commits which have deleted files, as well as the files that were deleted:
git log --diff-filter=D --summary
Make note of the desired commit hash, e.g.
e4e6d4d5e5c59c69f3bd7be2
.Restore the deleted file from one commit prior (
~1
) to the commit that was determined above (e4e6d4d5e5c59c69f3bd7be2
):git checkout e4e6d4d5e5c59c69f3bd7be2~1 path/to/file.ext
Note the
~1
.