553

I just deleted the wrong branch with some experimental changes I need with git branch -D branchName.

How do I recover the branch?

Stefan Kendall
  • 66,414
  • 68
  • 253
  • 406
  • 30
    Glad to know I'm not the only lame-o who did this (and forgot to regularly push to remote a copy) – Ray Aug 24 '17 at 11:48

12 Answers12

990

You can use git reflog to find the SHA1 of the last commit of the branch. From that point, you can recreate a branch using

git branch branchName <sha1>

Edit: As @seagullJS says, the branch -D command tells you the sha1, so if you haven't closed the terminal yet it becomes real easy. For example this deletes and then immediately restores a branch named master2:

user@MY-PC /C/MyRepo (master)
$ git branch -D master2
Deleted branch master2 (was 130d7ba).    <-- This is the SHA1 we need to restore it!

user@MY-PC /C/MyRepo (master)
$ git branch master2 130d7ba
sashoalm
  • 75,001
  • 122
  • 434
  • 781
bobDevil
  • 27,758
  • 3
  • 32
  • 30
111

If you know the last SHA1 of the branch, you can try

git branch branchName <SHA1>

You can find the SHA1 using git reflog, described in the solution --defect link--.

coding Bott
  • 4,287
  • 1
  • 27
  • 44
Chetan
  • 46,743
  • 31
  • 106
  • 145
68

If you just deleted the branch, you will see something like this in your terminal:

Deleted branch branch_name(was e562d13)
  • where e562d13 is a unique ID (a.k.a. the "SHA" or "hash"), with this you can restore the deleted branch.

To restore the branch, use:

git checkout -b <branch_name> <sha>

for example:

git checkout -b branch_name e562d13 
Derrick
  • 3,669
  • 5
  • 35
  • 50
54

Follow these Steps:

1: Enter:

git reflog show 

This will display all the Commit history, you need to select the sha-1 that has the last commit that you want to get back

2: create a branch name with the Sha-1 ID you selected eg: 8c87714

git branch your-branch-name 8c87714
iLearn
  • 991
  • 1
  • 13
  • 27
44

If you haven't push the deletion yet, you can simply do :

$ git checkout deletedBranchName
amichaud
  • 1,623
  • 12
  • 10
  • This answer makes Git Extensions shut up about "the branch you are trying to push seems to be a new branch for this remote." Thanks a lot. – Omer Tuchfeld Dec 21 '14 at 08:56
10

First: back up your entire directory, including the .git directory.

Second: You can use git fsck --lost-found to obtain the ID of the lost commits.

Third: rebase or merge onto the lost commit.

Fourth: Always think twice before using -D or --force with git :)

You could also read this good discussion of how to recover from this kind of error.

EDIT: By the way, don't run git gc (or allow it to run by itself - i.e. don't run git fetch or anything similar) or you may lose your commits for ever.

Cameron Skinner
  • 51,692
  • 2
  • 65
  • 86
  • yeah, that is why we use git, to avoid having to carry all that around. Every action you have committed is still available to you. – mateor May 03 '13 at 05:26
  • This works great! I was also able to visualize lost commits in a tree: `git fsck --lost-found | awk '/commit/{print $3}' | xargs gitk &` – Melebius Oct 26 '21 at 12:07
7

If you deleted a branch via Source Tree, you could easily find the SHA1 of the deleted branch by going to View -> Show Command History.

It should have the next format:

Deleting branch ...
...
Deleted branch %NAME% (was %SHA1%)
...

Then just follow the original answer.

git branch branchName <sha1>

EvZ
  • 11,889
  • 4
  • 38
  • 76
6

If you are using IntelliJ IDEA, in Event Log you'll see something like that:

enter image description here

And may simply restore your branch.

SerjantArbuz
  • 982
  • 1
  • 12
  • 16
5

Thanks, this worked.

git branch new_branch_name sha1

git checkout new_branch_name

//can see my old checked in files in my old branch

Rajeev Jayaswal
  • 1,423
  • 1
  • 20
  • 22
  • 2
    This is [not a forum](https://meta.stackexchange.com/q/92107/217657), please upvote useful answers instead of reposting them. – Melebius Oct 26 '21 at 12:09
5

First of all, don't get panic. You are in the right place. Go on champ, we all make mistakes! That's how we learn! I wish you health, happiness and success!

Oh for the answer! I think you already figured out!

If not! here is the answer.

use git reflog
git checkout branch branch_name commitsha

For more clarification, in the second command branch_name is the name you want to give your branch. commitsha is sha number you want to check out. which you will get from git reflog command.

Once again Happy coding!

Muradtheoz
  • 530
  • 5
  • 16
4

This worked for me:

git fsck --full --no-reflogs --unreachable --lost-found
git show d6e883ff45be514397dcb641c5a914f40b938c86
git branch helpme 15e521b0f716269718bb4e4edc81442a6c11c139
Alej priv
  • 81
  • 6
2

if you deleted a branch using GUI of a Jetbrains IDE(Goland, phpstorm etc)

go to

git windows(left-down corner of IDE) -> console tab -> now you can see log of executed commands by IDE and find the branch name and SHA1 from this log

Amin Shojaei
  • 5,451
  • 2
  • 38
  • 46