Finding And Restoring A Deleted File In Git
### TL;DR
If you delete a file and need to restore it but don't know the path you can search for it with the argument to the last `grep` in this command:
Code
| |
Once you find the filepath you're after, look for the commits that affected it with:
Code
Find the commit where you deleted the file and pull it back by using `~1` after the commit ID.
Code
At that point, it'll be staged in your existing branch and ready to commit.
I did a Digital Garden redesign of my site a few weeks ago. I switched over to Tailwind for CSS during the process. When I made the jump, I remove my old CSS files. Today, I realized that my custom code syntax highlighting was part of the purge. Here's how I got it back.
My site is stored in a git repository. I wasn't sure what the file was named, but I new it was a SCSS file and had that extension. So, I ran this command to get the file name:
Code
| |
Where:
- `git log` outputs the logs of the repo - `--diff-filter=D` limits the logs to just the deletes - `--summary` changes the output format so that includes the actions on the specific files that were modified.
For example, `git log` without `--summary` produces this:
Code
- `--reverse` flips the order of the output so that the most recently deleted files are at the end of the run (which makes them easier to find). - `grep delete` pull out just the lines with the file paths in them. So, instead of:
Code
We get simply:
Code
- And finally, `grep scss` is what I used to find the SCSS files.
Scrolling back through the output, I found the file I was after:
Code
Now I've got the filename and can search for the commits the included it with via:
Code
This returns:
Code
So, the commit where I deleted the file was `13e190c2a04b0cb96d7e8573e9187f6aae30625f`. I need to checkout the file from the commit _before_ that one. This is done by adding `~1`. This is the command I ran:
Code
If you get something like this error it means you didn't add the `~1`:
Code
Once you do the checkout it'll restore the file and stage it so it's ready to be committed back into your repo and you're all set.