Once upon a time, there was a file in my project that I would now like to be able to get.
The problem is: I have no idea of when have I deleted it and on which path it was.
How can I locate the commits of this file when it existed?
Once upon a time, there was a file in my project that I would now like to be able to get.
The problem is: I have no idea of when have I deleted it and on which path it was.
How can I locate the commits of this file when it existed?
If you do not know the exact path you may use
git log --all --full-history -- "**/thefile.*"
If you know the path the file was at, you can do this:
git log --all --full-history -- <path-to-file>
This should show a list of commits in all branches which touched that file. Then, you can find the version of the file you want, and display it with...
git show <SHA> -- <path-to-file>
Or restore it into your working copy with:
git checkout <SHA>^ -- <path-to-file>
Note the caret symbol (^
), which gets the checkout prior to the one identified, because at the moment of <SHA>
commit the file is deleted, we need to look at the previous commit to get the deleted file's contents
Get a list of the deleted files and copy the full path of the deleted file
git log --diff-filter=D --summary | grep delete
Execute the next command to find commit id of that commit and copy the commit id
git log --all -- FILEPATH
Show diff of deleted file
git show COMMIT_ID -- FILE_PATH
Remember, you can write output to a file using >
like
git show COMMIT_ID -- FILE_PATH > deleted.diff
Suppose you want to recover a file called MyFile
, but are uncertain of its path (or its extension, for that matter):
Preliminary: Avoid confusion by stepping to the git root
A nontrivial project may have multiple directories with similar or identical filenames.
> cd <project-root>
Find the full path
git log --diff-filter=D --summary | grep delete | grep MyFile
delete mode 100644 full/path/to/MyFile.js
full/path/to/MyFile.js
is the path & file you're seeking.
Determine all the commits that affected that file
git log --oneline --follow -- full/path/to/MyFile.js
bd8374c Some helpful commit message
ba8d20e Another prior commit message affecting that file
cfea812 The first message for a commit in which that file appeared.
Checkout the file
If you choose the first-listed commit (the last chronologically, here bd8374c), the file will not be found, since it was deleted in that commit.
> git checkout bd8374c -- full/path/to/MyFile.js
`error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.`
Just select the preceding (append a caret) commit:
> git checkout bd8374c^ -- full/path/to/MyFile.js
Summary:
You search your file full path in history of deleted files git log --diff-filter=D --summary | grep filename
You restore your file from commit before it was deleted
restore () {
filepath="$@"
last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
echo "Restoring file from commit before $last_commit"
git checkout $last_commit^ -- $filepath
}
restore my/file_path
size
of all deleted fileas well as the associated SHA
git log --all --stat --diff-filter=D --oneline
add a -p to see the contents too
git log --all --stat --diff-filter=D -p
To narrow down to any file simply pipe to grep and search for file name
git log --all --stat --diff-filter=D --oneline | grep someFileName
You might also like this one if you know where the file is
git log --all --full-history -- someFileName