Recover a deleted local branch

If you have accidentally deleted a branch that was never pushed to a remote, you can easily recover it in Git. You’ll need help from a useful Git utility called reflog. Let’s show you how to do it:

Suppose I have a local branch called feature_1, in which I have made a commit:

* ef640e4 (feature_1) Add settings flag for feature_1
* 4015b6f (HEAD -> main) Provide default for product size
* d8dc31c Add db info to settings

Now I, accidentally, delete the feature_1 branch:

$ git branch -D feature_1
Deleted branch feature_1 (was ef640e4).

So now all my work in that branch is gone 😱:

* 4015b6f (HEAD -> main) Provide default for product size.
* d8dc31c Add db info to settings.

Since I had not yet pushed the branch, I don’t have a copy of it on the remote, so I have to resort to reflog. Git always keeps a log of your activities in the repository. By activities, I mean anything that has to do with Git. So if you have committed anything, made a branch, stashed anything, it will be notes in the reflog. Git documentation defines it like this:

Reference logs, or “reflogs”, record when the tips of branches and other references were updated in the local repository. Reflogs are useful in various Git commands, to specify the old value of a reference.

So let’s use it in our case:

$ git reflog
4015b6f (HEAD -> main) HEAD@{0}: checkout: moving from feature_1 to main
ef640e4 HEAD@{1}: commit: Add settings flag for feature_1
4015b6f (HEAD -> main) HEAD@{2}: checkout: moving from main to feature_1
...

There it is! Our last commit in feature_1 branch: ef640e4 HEAD@{1}: commit: Add settings flag for feature_1. That is the location in our commit tree that we want to be at. It is worth mentioning that branches are nothing but “labels”. They just point to a commit in the tree. So if we can make the branch label point to that place in the commit tree, we have restored our branch as it was before deletion.

To do that, first, we recreate our lost branch:

$ git checkout -b feature_1
Switched to a new branch 'feature_1'

Basically we are recreating the label. But now it is pointing to the wrong commit. At the moment it is pointing to the same commit as main. In our new branch, we use the reset command with the --hard flag to set the branch tip to ef640e4 HEAD@{1}: commit: Add settings flag for feature_1.

(feature_1) $ git reset --hard ef640e4
HEAD is now at ef640e4 Add settings flag for feature_1

So if we look at the Git log, we can see that our branch is restored:

* ef640e4 (HEAD -> feature_1) Add settings flag for feature_1
* 4015b6f (main) Provide default for product size
* d8dc31c Add db info to settings

In this example we only had one commit in the branch, so we pointed to that. If you had more commits in your lost branch, the process is exactly the same. Just point to the last commit in the lost branch, and you are good to go.

Subscribe via RSS