ApiaryActive
Try: pause · settings · learn · wipe
← Community / Reading Room
GR
git · 3 min read

git reflog recovery

=====================================

=====================================

Have you ever found yourself frantically searching for a commit that seemed to vanish into thin air? Maybe you've been working on a feature, made some progress, and then suddenly realized you needed to rebase your branch onto the mainline. In your haste, you ran git reset --hard or git rebase -i, only to find that your precious work was gone.

Fear not! Git has a safety net for just such situations: git reflog. This powerful tool allows you to recover "lost" commits after a reset, rebase, or checkout operation. In this article, we'll explore the technique of using git reflog recovery and provide concrete examples to help solidify your understanding.

The Technique

When you run git commit, git merge, or other Git commands, they create new references in your repository's database. These references are stored in the .git/logs/HEAD file, which is what makes up the reflog. Think of it as a record of all changes made to the branch tips.

To use git reflog recovery, follow these steps:

  1. Run git reflog to see a list of all commit hashes and their corresponding messages.
  2. Identify the commit you want to recover, usually marked with (reset: ...) or similar notation.
  3. Use git checkout <commit_hash> (or git reset --hard <commit_hash>) to switch back to that commit.

Concrete Examples

Example 1: Recovering a Lost Commit After Reset

$ git status
# On branch feature/new-feature
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git restore <file>..." to discard changes in working directory)
#
nothing added to commit but untracked files present (use "git add" to track)

$ git reset --hard HEAD~1
$ git reflog
...
HEAD@{0}: reset: moving to 4e9c8b7... Initial commit

$ git checkout 4e9c8b7

Example 2: Recovering a Lost Commit After Rebase

$ git status
# On branch feature/new-feature
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git restore <file>..." to discard changes in working directory)
#
nothing added to commit but untracked files present (use "git add" to track)

$ git rebase -i HEAD~2
... (rebased, but lost some commits)
$ git reflog
...
HEAD@{0}: rebase (start): running interactively

$ git checkout 4e9c8b7

Example 3: Recovering a Lost Commit After Checkout

$ git status
# On branch feature/new-feature
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git restore <file>..." to discard changes in working directory)
#
nothing added to commit but untracked files present (use "git add" to track)

$ git checkout master
$ git reflog
...
HEAD@{0}: checkout: moving from feature/new-feature to master

$ git checkout HEAD~2

When NOT to Use It

While git reflog recovery is a powerful tool, there are situations where it might not be the best solution:

  • If you've run git commit --amend, the original commit will still be present in the reflog. However, if you've already pushed your amended commit to a remote repository, recovering the original commit won't undo the changes.
  • If you're working on a feature branch with many collaborators, using git reflog recovery might lead to conflicts or confusion among team members.

Related Apiary Lessons

To further solidify your understanding of Git and its safety nets, check out these related lessons:

  • Git Branching: Learn how to create, merge, and manage branches in Git.
  • Git Reset vs. Revert: Understand the differences between git reset and git revert, including when to use each command.

Conclusion

Don't let lost commits get you stung! With git reflog recovery, you can rescue your work even after a reset, rebase, or checkout operation. Remember to run git reflog regularly to ensure that all changes are recorded, and don't hesitate to reach for this safety net when needed.

As the bees say: "A safe hive is a happy hive!"

Frequently asked
What is git reflog recovery about?
=====================================
What should you know about the Technique?
When you run git commit , git merge , or other Git commands, they create new references in your repository's database. These references are stored in the .git/logs/HEAD file, which is what makes up the reflog. Think of it as a record of all changes made to the branch tips.
What should you know about when NOT to Use It?
While git reflog recovery is a powerful tool, there are situations where it might not be the best solution:
What should you know about related Apiary Lessons?
To further solidify your understanding of Git and its safety nets, check out these related lessons:
What should you know about conclusion?
Don't let lost commits get you stung! With git reflog recovery , you can rescue your work even after a reset, rebase, or checkout operation. Remember to run git reflog regularly to ensure that all changes are recorded, and don't hesitate to reach for this safety net when needed.
References & sources
  1. Apiary Reading RoomOpen, cited knowledge base — funded to keep bee & practical research free.
From the Apiary Reading Room. Opinion & editorial — not financial advice. We don't overclaim.
More from the Reading Room