问题
Here's the situation : some commits have been done in a remote repository.
Unfortunately, someone did push -f
such that no remote branch references these commits anymore.
To make matters worse, I don't have those commits in my local clone.
My goal is basically to recover those commits. These are some of the things I tried :
git checkout -b recovery <commit_id>
: fatal: reference is not a treegit push origin <commit_id>:recovery
error: refs/heads/recovery does not point to a valid object! error: unable to push to unqualified destination: recovery The destination refspec neither matches an existing ref on the remote nor begins with refs/, and we are unable to guess a prefix based on the source ref.
回答1:
The problem is that your local repository doesn't have that commit id.
git checkout -b recovery <commit_id>
git push origin <commit_id>:recovery
Both of these commands fail for that reason, I get the exact same messages with a GitHub repo if I use a commit id that doesn't exist locally.
I thought the answer will be simply fetching the lost commits locally, in one of these ways:
git fetch origin #1
git fetch origin SHA1 #2
git fetch origin SHA1:refs/remotes/origin/recovery #3
Unfortunately none of these work. It seems #2 used to work as of Git v1.4 according to this answer. As of now, it doesn't work anymore.
There is a help page for this on GitHub, but with no answer that you can use: it basically says that if you have the commit locally you can create a branch from it and push it. Yeah, but if you don't have the commit locally then what? It doesn't answer that.
I can think of two options:
- Find a teammate who has this commit. It's easy to check with
git log SHA1
. If anybody has it, they can create a branch from it withgit branch recovery SHA1
and then push it. - Contact bitbucket support. Since they have the commit, somewhere, they should be able to create a
recovery
branch for you.
回答2:
If you have the hash of the commit, then you can download the source tree from bitbucket with a link like this:
https://bitbucket.org/ownerName/repositoryName/get/A0B1C2D.zip
Both .zip and .tar.gz work.
This doesn't recover the commit(s) exactly, but at least you won't lose the source code changes. I used this to simply create another commit with the same changes.
回答3:
There is little trick - you said you have open the commit in web-interface. My version of the Stash has ability to create a tag on this commit. Look for "No tags [+]"
来源:https://stackoverflow.com/questions/21962653/recover-unreferenced-commits-from-remote-git-repository