Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?
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'

sly7-7 commented Dec 19, 2013

Thanks a lot for this. This saves me one day and a half of work :)

Great! Thank you very much for the article! It worked nicely.
I delete a local branch for mistake and I recovered 3 days of work!

Note: the commad
$ git fsck --full --no-reflogs --unreachable --lost-found

does not create the folder
.git/lost-found/commit/

I had to skip to the last step and run
$ git checkout -b branch-name COMMIT-NAME

I get ls: .git/lost-found/commit/: No such file or directory when I try to run the second step, I am not sure where I should look for it!

I tried this on windows OS and it's not working.

sorry, I just did'nt understand the commands.

so this is the actual recovering command:
git checkout -b <branch> <sha>

cff2880 commented Jul 9, 2014

Use this following command
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt
then, you can see the commits file inside .git folder under the name lost-found.txt

raul000 commented Aug 5, 2014

Note: the commad
$ git fsck --full --no-reflogs --unreachable --lost-found

does not create the folder
.git/lost-found/commit/

use
git fsck --lost-found

Efreeto commented Sep 28, 2014

Thank you jbgo!

For anyone stuck with dangling blobs like me, you can simply rename the files in .git/lost-found/other directory. Original file names are lost so you might have to dig through with some text search tool.

THANK YOU @jbgo!!!!

Saved my whole day with this command πŸ˜„

There are no commit messages in my lost and found, but there are unreachable commits, when i type:
$ git fsck --full --no-reflogs --unreachable --lost-found I get:
Checking object directories: 100% (256/256), done.
unreachable commit 78d0659cd8bf471dc6d94d5d80691e21979e5fde
unreachable commit 8970d0a30ab42e45eb10e474b0fd76f082a35008
unreachable commit 99f040af9dabbb0d4afcc2a133158835cdf0fe1c
unreachable blob b910a0caf457cccce18d603acc0256a639668fcc
unreachable blob dd58ec3e67e16d1a4ee99c4df5a7f479029c6000
unreachable commit e6b8f90ff9ef19a52ad06a288894c5c254b9d0bb
unreachable blob 35390ef7dc2372f74028f02a419d4e725a03ef2d

Then when I type:
git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt

I get an empty text document. Basically what happened was,I accidentally synced my folder before I committed new changes. I tried to commit changes and I thought that it had finished and the I clicked sync to get data from the internet, but it failed to commit and it just synced and I lost a bunch of work. Then I removed the repository and added it again ( I know a mistake).

Please help, I am new to this and lost a tremendous amount of work. Thanks!

git reflog

WOW! @jbgo

Thank you so much!

You just saved me more than a day of work accidentally deleted.

For those who are having the problem of the /lost-found/ directory not being created, you can use the following to view all of the lost commit messages:

git fsck --lost-found | grep commit | cut -d ' ' -f 3 | xargs -n 1 git log -n 1 --pretty=oneline

Basically it just slices out the blobs, picks the third word of that output which is the SHA then passes it to the command in step 2

Saved me a week

Thank you very much!
This saved me a lot of time.

NadunW commented Jul 30, 2015

Thanks a lot..

You saved my 20 days work...

thanks... you saved a life...

TatyCat commented Sep 29, 2015

Thank you so much for including an example of what the command is supposed to look like!

icyflame commented Oct 2, 2015

@cff2880 Thanks a lot! Your command works!

git fsck --full --no-reflogs --unreachable --lost-found | grep commit | cut -d\ -f3 | xargs -n 1 git log -n 1 --pretty=oneline > .git/lost-found.txt

Thanks!!

I hit sync and it deleted a project folder I had been working on for a week, I have to turn it in today! :/ Any way I can retrieve it?

Thank you for saving my sanity.

bosnian commented Feb 24, 2016

πŸ‘

Yo I also hit sync and lost all my local unpushed files/was left with my last remote save. What do I do??

jomonkj commented Jun 14, 2016

Thanks a lot....

Thanks a lot, It works for me....

aiosk commented Aug 4, 2016

thanks a lot,
it saved my 2 week worth of work

bodedra commented Sep 13, 2016

Thanks a lot for useful post.

PombaM commented Nov 10, 2016 edited

Thanks man, you saved my life long live git reflog! Now where is the damn πŸ‘ button?

That just saaaaaaved my life! πŸ˜„ Or one week experimenting and one week of work.
❀️

Dude, you just saved my rear end.. Big time! What I did, which could be a little different from what others did, was once I had the list of blobs and unreachable commits, I just used the cat file command with git to get the blob contents and restore the work that I had lost. It wasn't more than a couple of hours of work across a few files, so it was a lot easier than some of the other commenters I'm seeing here.

git cat-file -p 52fbee04a2...blahblahblah

Thanks a ton!!

OMGGGGGGGG ❀️

zapkub commented Jan 12, 2017

MAN, you save my entire week !!

Thank you! Realised after I had deleted my branch that it was the only copy of the code I'd been working on!

Total lifesaver πŸ‘

Thanks a lot it really helped :)

I have lot (19k) of non-commit files in my .git/lost-found/other folder with sha1. How can i recover them. I did some research i came to know that, git show sha1 will show the file content, i cant do all these manually. How can i get back all my files. Is there any way, please let me know if some one might come across same problem.

Step 1 does not create .git/lost-found in git version 2.13.2 on cygwin.

Thank you so much.

Thank you so much !

As said previously I used :

git fsck --lost-found       
ls -1 .git/lost-found/commit/ | xargs -n 1 git log -n 1 --pretty=oneline
git checkout <tag>

damusix commented Aug 4, 2017

Dude you friggin saved my life... where the hell can I buy you a beer?!

thanks man! awesome!

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