Browse orphaned commits in Git

Question:

My git repository has somehow gone wonky – I loaded up msysgit this morning and instead of the branch name being shown after the current directory, it says “((ref: re…))”, ‘git status’ reports everything as a new file, ‘git log’ and ‘git reflog’ tell me “fatal: bad default revision ‘HEAD'”, and so on.

Doing ‘git reflog –all’ or ‘gitk –all’ shows me the rest of the repository is intact, but it looks like the branch I was working on has just disappeared, which explains why HEAD doesn’t seem to exist/point to anything.

I know git keeps hold of all sorts of globs of information, and I’m assuming my commits have just been orphaned somehow, so is there some command that will show me those commits so I can reset HEAD to them?

EDIT: Oh dear. I discovered ‘git fsck’, and ‘git fsck –full’ reports “fatal: object 03ca4… is corrupted”. What the devil can I do about that?

EDIT: Oh dear oh dear. I checked out another branch, then tried to re-create the original branch with the same name using ‘git checkout -b lostbranchname’, and git says “error: unable to resolve reference refs/heads/lostbranchname: No error, fatal: Failed to lock ref for update: No error”. ‘No error’ must be a particularly nasty error. So it looks like it’s still hanging around, but unable to be used and unable to be killed.

EDIT: Super duper oh dear. I’ve done a bunch of unpacking and repacking and replacing of things as suggested here: How to recover Git objects damaged by hard disk failure?, but now I’m getting another hash reported as corrupt, for something as innocuous as ‘git status’. I think the entire thing is hosed. Git’s lovely and all, but I shouldn’t have to deal with this kind of thing.

Answer:

Rather than leave this open I think I’ll give an answer to my own question. Using git reflog --all is a good way to browse orphaned commits – and using the SHA1 hashes from that you can reconstruct history.

In my case though, the repository was corrupted so this didn’t help; git fsck can help you find and sometimes fix errors in the repository itself.

Leave a Reply