Skip to content

Instantly share code, notes, and snippets.

@jbgo
Last active May 23, 2024 12:29
Show Gist options
  • Save jbgo/1944238 to your computer and use it in GitHub Desktop.
Save jbgo/1944238 to your computer and use it in GitHub Desktop.
How to recover a git branch you accidentally deleted

UPDATE: A better way! (August 2015)

As pointed out by @johntyree in the comments, using git reflog is easier and more reliable. Thanks for the suggestion!

 $ git reflog
1ed7510 HEAD@{1}: checkout: moving from develop to 1ed7510
3970d09 HEAD@{2}: checkout: moving from b-fix-build to develop
1ed7510 HEAD@{3}: commit: got everything working the way I want
70b3696 HEAD@{4}: commit: upgrade rails, do some refactoring
98f2fc2 HEAD@{5}: commit: a couple code cleanups
d09f35e HEAD@{6}: commit: remove test method - it served it's purpose and now it must go
d586a93 HEAD@{10}: commit: aha! that is why I'm so fail
4644046 HEAD@{11}: commit: cleaning up the initial migration for dev/test environments
323df37 HEAD@{15}: commit: bump ruby version
eab861c HEAD@{16}: commit: bundle update EVERYTHING
2b544c4 HEAD@{17}: commit: fixing what few tests actually exist - a.k.a., wow! does this app even work?
3970d09 HEAD@{18}: checkout: moving from develop to b-fix-build
3970d09 HEAD@{19}: pull: Fast-forward

Once you find the commit you're looking for, create a new branch from it and you're done!

$ git checkout -b branch-name 70b3696
Switched to a new branch 'branch-name'

Original post

Oops! I accidentally deleted a local git branch, and I haven't pushed it to a remote server yet. The branch has several important commits, and it hasn't been merged with any other branches yet. How do I find the missing branch?

1. Create a list of all dangling or unreachable commits.

$ git fsck --full --no-reflogs --unreachable --lost-found
unreachable tree 4a407b1b09e0d8a16be70aa1547332432a698e18
unreachable tree 5040d8cf08c78119e66b9a3f8c4b61a240229259
unreachable tree 60c0ce61b040f5e604850f747f525e88043dae12
unreachable tree f080522d06b9853a2f18eeeb898724da4af7aed9
unreachable blob bf01f514add2ada00a7ae5c666493d30d639018c
...

These commits are copied into .git/lost-found/commit/, and non-commit objects are copied into .git/lost-found/other/.

2. Print a list of commit messages for all commits in the lost and found.

$ ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline
63b65d3784b16f92bb370ad6a2c1091a05824ecc Call #to_s on value before calling some string methods, like gsub
6ed99e63db69ca04f0cc78081a1fd471289551b2 On master: search and reset page
973d9be3e2cefcd0c5801ad9cd1b2e18774b4bee Rename decorator proxy to decorator context
9ae38fc6b0548cab08ccee1178db0ba0edeafdb2 foo
9e994ca0c0c4785ab45bf64b367fdacccc4575a9 foo [#12345]
9efa6b28b3b0a89c312484f28cf589385d613dfd On master: mysql db config
c57a67c7e1c21fa0c32f152e73d8c3376cad19a0 bar
cb3d67e1aa2226ab9d816fc541f36ff698bfda41 WIP on master: 40a4453 Use #website_url instead of #template_url or #url
def0a251bd29b7fc54a5622e364711f60097b826 Example tabs for export show page (no styles)w

3. Find your missing commit through the process of manual inspection (i.e. reading).

If you need more information on a commit, you can always use a more detailed log command, such as git log -p --stat --color 9ae38fc.

4. Create a new branch with the missing commit as the branch head.

$ git checkout -b branch-name 9ae38fc
Switched to a new branch 'branch-name'
@MatheusMuriel
Copy link

Niiice, thanks

@erickterra
Copy link

You saved my life. Thanks

@Rudo2204
Copy link

Thanks you, you saved me a full day of work here!

@ngocgiang99
Copy link

You save my life now.

@NathanTarbert
Copy link

So I created a repo, scrapped it, tried to recreate a repo it said it was already initialized. My code was complete in a branch called branch2-2 somehow modified it and lost a folder in the branch. Is there a way to retrieve it? Technically the branch only existed on my local machine and it deleted the folder right out of my VS code... Not sure what to do. Thanks!

@fxyw
Copy link

fxyw commented Jan 24, 2021

@raflymln
Copy link

raflymln commented Mar 8, 2021

You saving me from my work for 3 month non-stop, thank you so much man, i hope you're doing great 👍

@francescopappalardo
Copy link

Thank you very much also from my side. It saved two working days!

@sga-solita
Copy link

Thank you! Saved me many hours of (re)work!

@lbluitt
Copy link

lbluitt commented May 17, 2021

Thank you!!!! too useful

@GoudekettingRM
Copy link

Saved my butt here, thank you!

@akenz1901
Copy link

A huge Thank you to everyone that contributed to this solution

@sanketbhangale43
Copy link

Thank you

@sanjay-sridharan
Copy link

Thank you, Mr Jordan Bach!

@renat-fayzullin
Copy link

Thanks!

@egemenertugrul
Copy link

Blessings upon thee. 🙏

@kouliksarker
Copy link

Thanks man for saving me

@msantos-nyscf
Copy link

If you tie a branch to a pull request, you can restore it from the PR's page - https://docs.github.com/en/repositories/configuring-branches-and-merges-in-your-repository/managing-branches-in-your-repository/deleting-and-restoring-branches-in-a-pull-request

My repository has +1400 PRs, and I was still able to go to the first pull request from years ago & see the "Restore Branch" button.

@passion-lab
Copy link

Thanks you a lot!

You have helped me a lot in this issue. I'll be thankful to you for your support.
Keep extending your helping hand...

@Niloys7
Copy link

Niloys7 commented Mar 29, 2023

Thank you very much!

@vishalpatel1327
Copy link

Same here ,
this post same my life too.

@tonghe7
Copy link

tonghe7 commented May 23, 2024

Wow! Didn't know you could do this!
I salute you nine years later, you are the man!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment