我想从 github 下载我的项目而不使用“git clone”命令。所以我遵循了这个指南
git init
git add .
git commit -m "Add existing project files to Git"
git remote add origin https://github.com/cameronmcnz/example-website.git
git push -u -f origin master
完成此操作后,我们所有的 1000 多个提交都消失了!我们能做些什么来恢复我们的承诺吗?
如有任何帮助,我们将不胜感激!
假设您以创建
new存储库的方式运行
git init
(而不是“重新初始化”现有存储库),这正是您应该从该命令序列中期望得到的结果。 (旁注:当然可以尝试一些东西,看看会发生什么,但作为一般规则,除非你意识到更大的限制,否则永远不要尝试一些特别珍贵的东西。)
在[使用
]之后,我们所有的1000+提交都消失了!git push --force
从技术上讲,它们实际上并没有“消失”。 你只是无法找到它们。1Git需要提交的哈希ID来查找它。 从这个意义上说,Git 为我们(人类)提供了名称:分支名称、标签名称和其他此类名称。 这些名称具有关联的哈希 ID;如果它们是提交哈希 ID,那么我们可以直接通过该名称找到这些提交。 如果它们是标签对象哈希 ID,则可以让我们间接找到提交。2 由于每个提交在其元数据中存储了一个列表(通常只有一个元素长),因此我们只需要通过这种方式在某个链中找到
最后一个提交即可。 该提交将引导我们(和 Git)回顾历史。 这反过来就是你问题的答案:我们可以做些什么来恢复我们的承诺吗?
如果您可以在您告诉 GitHub 用此其他提交哈希 ID 覆盖的分支名称上找到最新提交的哈希 ID,则可以从 GitHub 取回这些其他提交。 这取决于两件事关于
GitHub:
它们总是让您通过原始哈希 ID 访问任何提交。3
他们从不git fetch origin <full-hash-id>:refs/heads/recovered
存储库中,有一个名为
recovered
的新分支,它指向您找到的提交。 如果这是链中的last
提交,您可以使用 git log recovered
查看所有提交。 如果这不是最后一次,您可以继续寻找稍后的提交。
git fetch
来获取这些提交。另请注意,如果您找到一个月前提交的哈希 ID,并使用:
git fetch origin <hash-id>:refs/heads/recovered
recovered
分支,然后找到另一个哈希 ID,您可以运行:
git fetch origin <new-hash-id>:recovered
(你不再需要拼写出
refs/heads/recovered
,不过如果你愿意的话也可以),你的 Git 会判断这是否真的是一个 later提交,如果是的话,“添加”到你的
recovered
分支。 如果是
较早提交,您的 Git 会说此
git fetch
操作不是“快进”,并拒绝从您的 recovered
分支中drop提交。这是/不是“快进”测试与 git push origin <name>
避免“丢失”来自 GitHub 存储库的提交的方式相同。 使用 --force
(对于获取和推送都存在),覆盖此保护。 这就是为什么你运行的
git push --force
失去了你的提交:你超越了通常的保护。
1如果利文斯通博士在非洲失踪了,他真的存在吗?亨利·莫顿·斯坦利说是的,但另一方面,他
利文斯通。 后来,他在国王利奥波德二世和刚果河地区进行了实验,结果产生了悲剧性的结果。 2带注释的标签对象可以引用树或 blob,甚至可以引用另一个带注释的标签对象,但这很不寻常:大多数引用提交。
3这是使用 Git 版本 2.18 左右引入的新奇“部分克隆”功能所必需的。 (部分是在 2.17 中,直到最近,事情才真正运作良好。但是 2.18 是故意放松协议的时候。部分克隆仍然存在粗糙的边缘,但从 Git 2.32 左右开始,它们似乎相当不错可以使用。)