情况如下:某些提交已在远程存储库中完成。
不幸的是,有人做了push -f
,因此没有远程分支引用这些提交。
更糟糕的是,我没有在我的本地克隆中提交这些提交。
我的目标基本上是恢复这些提交。这些是我尝试的一些事情:
git checkout -b recovery <commit_id>
:致命:引用不是树git push origin <commit_id>:recovery
错误:refs / heads / recovery没有指向有效对象!错误: 无法推送到不合格的目的地:恢复目的地 refspec既不匹配遥控器上的现有参考也不匹配 refs /,我们无法根据源参考来猜测前缀。
答案 0 :(得分:3)
如果您有提交的哈希值,那么您可以从bitbucket下载源代码树,其链接如下:
public class MyClass {
// class itself can modify m_MyList
private IList<int> m_MyList = new List{1, 2, 3};
...
// ... while code outside can't
public IReadOnlyList<int> MyList {
get {
return m_MyList;
}
}
}
.zip和.tar.gz都可以。
这并不能完全恢复提交,但至少你不会丢失源代码更改。我用它来简单地创建另一个具有相同更改的提交。
答案 1 :(得分:1)
问题是您的本地存储库没有该提交ID。
git checkout -b recovery <commit_id>
git push origin <commit_id>:recovery
由于这个原因,这两个命令都失败了,如果我使用本地不存在的提交ID,我会使用GitHub repo获得完全相同的消息。
我认为答案只是在本地获取丢失的提交,其中一种方式是:
git fetch origin #1
git fetch origin SHA1 #2
git fetch origin SHA1:refs/remotes/origin/recovery #3
不幸的是,这些都不起作用。根据{{3}},似乎#2用于Git v1.4。截至目前,它已不再适用。
有一个this answer,但没有你可以使用的答案:它基本上说如果你在本地提交你可以从它创建一个分支并推送它。是的,但是如果你没有本地提交那么呢?它没有回答这个问题。
我可以想到两个选择:
git log SHA1
可以轻松查看。如果有人拥有它,他们可以使用git branch recovery SHA1
从中创建一个分支,然后推送它。recovery
分支。答案 2 :(得分:0)
有一点技巧 - 你说你已经在web界面中打开了提交。 我的Stash版本能够在此提交中创建标记。寻找“无标签[+]”