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
sly7-7 commented Dec 19, 2013

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

@francescostella

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

@andreorvalho

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!

@marlocorridor

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
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
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
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.

@esttorhe

THANK YOU @jbgo!!!!

Saved my whole day with this command πŸ˜„

@huckl3b3rry87

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!

@johntyree

git reflog

@mateusrevoredo

WOW! @jbgo

Thank you so much!

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

@Sporky023

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

@SajilKoroth

Saved me a week

@firvorski

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

@NadunW
NadunW commented Jul 30, 2015

Thanks a lot..

You saved my 20 days work...

@kushal1211

thanks... you saved a life...

@TatyCat
TatyCat commented Sep 29, 2015

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

@icyflame
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
@renanborgez

Thanks!!

@reyarias

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?

@rylectro

Thank you for saving my sanity.

@bosnian
bosnian commented Feb 24, 2016

πŸ‘

@CatherineMcMahon

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

@jomonkj
jomonkj commented Jun 14, 2016

Thanks a lot....

@remyamurali

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

@aiosk
aiosk commented Aug 4, 2016

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

@bodedra
bodedra commented Sep 13, 2016

Thanks a lot for useful post.

@PombaM
PombaM commented Nov 10, 2016 edited

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

@DomDomHaas

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

@williambeeler

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!!

@walkingbrad

OMGGGGGGGG ❀️

@zapkub
zapkub commented Jan 12, 2017

MAN, you save my entire week !!

@SKHameed86

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 πŸ‘

@amanhigh

Thanks a lot it really helped :)

@sreenathveer

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.

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