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 discover that I need to restore that file after deleting it.
I know I can checkout a file using
git checkout <commit> -- filename.txt, but I don’t know when that file was deleted.
- How do I find the commit that deleted a given filename?
- How do I restore that file back into my working copy?
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"
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.
Restore the deleted file from one commit prior (
~1) to the commit that was determined above (
git checkout e4e6d4d5e5c59c69f3bd7be2~1 path/to/file.ext