Troubleshooting & Comparisons

Troubleshooting Git Reflog to Recover Lost Commits

Learn how to recover lost commits using Git reflog in cases of bad resets or deleted branches.

3 min read

Learn how to recover lost commits using Git reflog and restore your project after a bad reset or deleted branch.

How to Identify Symptoms of a Lost Commit

Losing a commit in Git often manifests in ways that can cause alarm. Here are common symptoms:

  • Your branch or commit history appears incomplete.
  • Recent changes vanish after executing a git reset or deleting a branch.
  • You may feel that critical work has been lost permanently.

These situations are recoverable if the changes were committed before the issue occurred.

Understanding How Git Reflog Retains Local History

Git reflog is a powerful tool that records the local history of various Git actions, such as:

  • Commits, checkouts, branch modifications, and resets.
  • Even "unreachable" commits (commits no longer referenced by a branch) are temporarily retained.

Important facts about Git reflog:

  • Reflog entries typically expire after 30 to 90 days. This timeframe can be adjusted using Git’s configuration.
  • Reflog data is stored locally. It does not sync with remote repositories.
  • Uncommitted changes cannot be recovered using Git reflog.

Steps to Recover a Lost Commit Using Git Reflog

If you've accidentally reset your branch too far or deleted a branch, Git reflog can help you retrieve the lost commit. Follow these steps:

steps

  1. List recent Git actions
    Use git reflog to display a timeline of your repository's actions.

    bash
    git reflog

    Look for entries like reset, checkout, or commit. Each action will be associated with a commit hash.

  2. Find the desired commit to recover
    Identify the commit you need. Reflog entries are displayed in the format HEAD@{n}, where n is the action index (e.g., HEAD@{2}).

  3. Restore the lost commit
    You can switch to the lost commit or create a new branch from it.

    bash
    git checkout <commit-hash>

    Alternatively, to create a new branch at the recovered commit:

    bash
    git branch <new-branch-name> <commit-hash>

Gotchas When Using Git Reflog

Takeaways from Git Reflog Usage

Git reflog is an essential tool for recovering lost commits after a bad reset or a branch deletion. It logs nearly every action locally, allowing you to restore lost work as long as the changes were committed. However, it’s vital to remember that:

  • Uncommitted changes are unrecoverable.
  • Reflog entries expire within 30-90 days.

By becoming familiar with Git reflog, developers can reduce the anxiety of unintentional mistakes and confidently recover their work.

FAQ

How do I recover a specific commit after a reset?

Run git reflog to locate the desired commit's hash. Then, use git checkout <commit-hash> to switch to it or git branch <new-branch-name> <commit-hash> to create a new branch starting from the commit.

Can Git reflog restore uncommitted changes?

No, Git reflog only tracks committed actions. To avoid losing uncommitted work, consider using git stash before performing actions like resets or rebases.

Does Git reflog expire?

Yes, reflog entries expire after 30-90 days by default. This duration can be adjusted using the gc.reflogExpire and gc.reflogExpireUnreachable settings in Git configuration.

Can I recover reflog data on a different machine?

No, Git reflog is stored locally and does not sync with remote repositories. Recovery must happen on the machine where the actions occurred.


Official reference: Git reference manual.