2025-02-05
6 min read

How to Find and Restore a Deleted File in Git

How to Find and Restore a Deleted File in Git

You deleted a file and committed the deletion, or someone else deleted it in a previous commit. Now you need to find and restore it. Git keeps the complete history of all files, making it possible to recover deleted files.

TLDR: To restore a deleted file, first find when it was deleted with git log -- path/to/file, then restore it from the commit before deletion using git checkout commit-hash^ -- path/to/file. The ^ means "parent commit" - the version before deletion.

In this guide, you'll learn how to find and recover deleted files from Git history.

Prerequisites

You'll need Git installed on your system and a repository with deleted files you want to recover. Basic familiarity with Git commands like log and checkout will be helpful.

Finding When a File Was Deleted

First, locate the commit that deleted the file:

# Find deletion commit
git log --full-history -- path/to/deleted-file.js

# Output shows commits that touched the file, including deletion:
# commit abc123
# Author: Jane Developer
# Date:   Mon Jan 15 14:30:00 2024
#
#     Remove obsolete authentication code

The --full-history flag makes sure Git shows the deletion even if the file no longer exists.

Finding All Deleted Files

To see all files deleted in the repository:

# List all deleted files
git log --diff-filter=D --summary | grep delete

# Output:
# delete mode 100644 src/old-auth.js
# delete mode 100644 config/legacy.json

This shows every file that was deleted throughout history.

Restoring a Deleted File

Once you know the deletion commit, restore from just before it:

# abc123 is the commit that deleted the file
# Restore from its parent (the commit before deletion)
git checkout abc123^ -- path/to/deleted-file.js

# The file is now restored in your working directory
git status
# new file:   path/to/deleted-file.js

The ^ notation means "parent of this commit" - the version before deletion.

Restoring to a Specific Commit

To restore the file as it existed at a specific point:

# Restore from specific commit
git checkout def456 -- path/to/deleted-file.js

# Or restore from a tag
git checkout v1.0.0 -- path/to/deleted-file.js

# Or from a branch
git checkout main~5 -- path/to/deleted-file.js

Finding File by Partial Name

If you do not remember the exact path:

# Search for files matching pattern
git log --all --full-history --diff-filter=D -- '**/auth*.js'

# Or use grep
git log --all --full-history --summary | grep -i "delete.*auth"

Viewing File Content Before Deletion

To see what the file contained without restoring it:

# Show file content from before deletion
git show abc123^:path/to/deleted-file.js

# Or pipe to editor
git show abc123^:path/to/deleted-file.js | less

Restoring Multiple Deleted Files

To restore several files at once:

# Restore multiple files from same commit
git checkout abc123^ -- file1.js file2.js file3.js

# Restore entire directory
git checkout abc123^ -- path/to/directory/

Finding File in Branch History

If the file was deleted from one branch but exists in another:

# Check if file exists in other branches
git log --all --full-history -- path/to/file.js

# Shows which branches have the file
# Then restore from that branch
git checkout other-branch -- path/to/file.js

Using Git Rev-List for Searching

For more advanced searching:

# Find all commits that touched the file
git rev-list --all -- path/to/file.js

# Get the last commit that had the file
git rev-list -n 1 HEAD -- path/to/file.js

Recovering Very Old Deletions

For files deleted long ago:

# Search entire history
git log --all --full-history --oneline -- old-file.js

# Find the commit
# Restore from before deletion
git checkout ancient-commit^ -- old-file.js

Finding When File Was Last Modified

To see the last actual modification before deletion:

# Show history with diffs
git log -p --full-history -- deleted-file.js

# Last commit shows the deletion (lines removed)
# Previous commit shows last actual changes

Restoring File Deleted in Merge

If a file was deleted during a merge:

# Find the merge commit
git log --merges --full-history -- deleted-file.js

# Restore from before merge
git checkout merge-commit^ -- deleted-file.js

# Or from other parent
git checkout merge-commit^2 -- deleted-file.js

Creating a Script to Find Deleted Files

Automate the search:

#!/bin/bash
# find-deleted.sh - Find when a file was deleted

FILE="$1"

echo "Searching for deletion of $FILE..."

# Find deletion commit
COMMIT=$(git rev-list -n 1 HEAD -- "$FILE")

if [ -z "$COMMIT" ]; then
    echo "File not found in history"
    exit 1
fi

echo "Last commit with file: $COMMIT"
git show --summary $COMMIT

echo ""
echo "To restore: git checkout $COMMIT -- $FILE"

Use it:

chmod +x find-deleted.sh
./find-deleted.sh path/to/file.js

Restoring File and Viewing Diff

To see what changed when restoring:

# Restore the file
git checkout abc123^ -- deleted-file.js

# See differences from current branch
git diff HEAD deleted-file.js

# See what the deletion removed
git show abc123 -- deleted-file.js

Recovering from Accidental Deletion

If you just deleted a file but have not committed:

# File was deleted but not committed
git status
# deleted:    important-file.js

# Restore from HEAD
git checkout HEAD -- important-file.js

# Or restore all deleted files
git checkout HEAD -- .

Finding File in Stash

If you deleted a file and stashed changes:

# List stashes
git stash list

# Check if file is in a stash
git stash show -p stash@{0} | grep deleted-file.js

# Restore from stash
git checkout stash@{0} -- deleted-file.js

Restoring Directory Structure

If an entire directory was deleted:

# Find when directory was deleted
git log --full-history -- path/to/directory/

# Restore entire directory
git checkout abc123^ -- path/to/directory/

# All files in the directory are restored

Searching by Content

If you remember file contents but not the name:

# Search commit messages
git log --all --grep="authentication"

# Search code content
git log -S "specificFunctionName" --all

# Once found, restore as usual
git checkout found-commit -- path/to/file.js

Viewing File History Timeline

To see complete file timeline:

# View all changes to file
git log --follow --all -p -- file.js

# Shows:
# - Creation
# - All modifications
# - Renames
# - Deletion

Preventing Accidental Deletions

Use Git hooks to warn about deletions:

# .git/hooks/pre-commit
#!/bin/bash

DELETED=$(git diff --cached --diff-filter=D --name-only)

if [ -n "$DELETED" ]; then
    echo "Warning: The following files will be deleted:"
    echo "$DELETED"
    read -p "Continue? (y/n) " -n 1 -r
    echo
    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
        exit 1
    fi
fi

Recovering After Force Push

If someone force-pushed and deleted files:

# Find commit before force push
git reflog

# Restore files from that point
git checkout HEAD@{1} -- deleted-files/

Best Practices

Always search before assuming a file is gone:

# Check if file still exists somewhere
git log --all --full-history -- path/to/file

# Check other branches
git branch -a --contains filename

Document why you're restoring:

git checkout abc123^ -- old-file.js
git add old-file.js
git commit -m "Restore old-file.js - needed for legacy API support
Original deletion in commit abc123 was premature"

Review before restoring:

# Check what you're restoring
git show abc123^:path/to/file.js

# Make sure it's the right version
# Then restore
git checkout abc123^ -- path/to/file.js

Create aliases for common recovery operations:

# Add to ~/.gitconfig
[alias]
    find-deleted = log --diff-filter=D --summary
    restore = "!f() { git checkout $(git rev-list -n 1 HEAD -- \"$1\")^ -- \"$1\"; }; f"

# Use them
git find-deleted
git restore path/to/deleted-file.js

Now you know how to find and restore deleted files in Git. Use git log --full-history to find when a file was deleted, then git checkout commit^ to restore it from before the deletion. Git's complete history means no file is ever truly lost unless the commits themselves are deleted.

Published: 2025-02-05|Last updated: 2025-02-05T10:00:00Z

Found an issue?