474

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
  • 64,006
  • 65
  • 247
  • 399
  • 21
    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

10 Answers10

869

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
  • 69,127
  • 105
  • 396
  • 720
bobDevil
  • 25,598
  • 3
  • 29
  • 29
81

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,187
  • 1
  • 26
  • 43
Chetan
  • 44,172
  • 28
  • 104
  • 142
44

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

$ git checkout deletedBranchName
amichaud
  • 1,483
  • 11
  • 9
  • 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
43

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 
developerick
  • 3,164
  • 4
  • 35
  • 43
26

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
greencheese
  • 704
  • 10
  • 25
  • 4
    Thank you very much. This worked for me. My 2 months of work was lost. This solution helped recover those files. – Amit Jan 20 '21 at 13:00
9

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
  • 48,389
  • 2
  • 64
  • 82
  • 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
  • You save me 30h work, thanks! Accidentally delete a branch with only local commits, which I made a week ago and don't push. – Sergey Sep 03 '21 at 06:51
  • 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
4

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,193
  • 1
  • 14
  • 21
  • 1
    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
3

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,288
  • 4
  • 37
  • 73
2

This worked for me:

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

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
  • 3,796
  • 2
  • 27
  • 38