Git Reflog
What is Git Reflog?
git reflog records updates to the tip of branches and HEAD.
It lets you see where your branch and HEAD have been, even changes you made by mistake.
This is useful for recovering lost commits or undoing a reset.
When to Use Git Reflog
Use git reflog when you need to:
- Recover lost commits or changes
- Undo a reset or a merge
- See the history of your branch and HEAD
Show the Reflog
To see the history of where HEAD and branches have pointed, use:
Example
git reflog
e56ba1f (HEAD -> main) HEAD@{0}: commit: Revert "Just a regular update, definitely no accidents here..."
52418f7 HEAD@{1}: commit: Just a regular update, definitely no accidents here...
9a9add8 (origin/main) HEAD@{2}: commit: Added .gitignore
81912ba HEAD@{3}: commit: Corrected spelling error
3fdaa5b HEAD@{4}: merge: Merge pull request #1 from w3schools-test/update-readme
836e5bf HEAD@{5}: commit: Updated readme for GitHub Branches
...
Try it Yourself »
This lists recent positions of HEAD, so you can see actions like commits, resets, merges, and checkouts.
Find and Recover Lost Commits
If you accidentally reset or deleted commits, you can use the reflog to find the commit and restore it.
Each entry in the reflog has a reference like HEAD@{2}.
Example: Undo a Hard Reset
git reflog
9a9add8 (HEAD -> main, origin/main) HEAD@{0}: reset: moving to HEAD~2
e56ba1f HEAD@{1}: commit: Revert "Just a regular update, definitely no accidents here..."
52418f7 HEAD@{2}: commit: Just a regular update, definitely no accidents here...
9a9add8 (HEAD -> main, origin/main) HEAD@{3}: commit: Added .gitignore
...
git reset --hard HEAD@{1}
HEAD is now at e56ba1f Revert "Just a regular update, definitely no accidents here..."
Try it Yourself »
The reset is the newest entry, HEAD@{0}. HEAD@{1} is where the branch was just before the reset, so resetting to it brings back the two lost commits.
Clean Up the Reflog
The reflog is automatically cleaned by Git, but you can manually expire old entries if needed:
Example
git reflog expire --expire=30.days refs/heads/main
git gc --prune=now
Counting objects: 15, done.
Compressing objects: 100% (10/10), done.
Pruning objects
Try it Yourself »
This removes reflog entries older than 30 days for the main branch and runs garbage collection.
Tips & Best Practices
- Use
git reflogregularly to keep track of your changes - Use
git reflogto recover lost commits or changes - Use
git reflog expireto clean up old entries
Troubleshooting
If you encounter issues with git reflog, try:
- Checking the Git documentation for more information
- Searching online for solutions to specific issues
- Seeking help from a Git expert or community
Warnings
git reflog only shows where HEAD has been; it does not change anything. It is git reset --hard that discards uncommitted changes, so commit or stash your work before you reset to a reflog entry.