所有 Github 提交在推送后都消失了

问题描述 投票:0回答:1

我想从 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 多个提交都消失了!我们能做些什么来恢复我们的承诺吗?

如有任何帮助,我们将不胜感激!

git github git-push
1个回答
3
投票

假设您以创建

new
存储库的方式运行git init(而不是“重新初始化”现有存储库),这正是您应该从该命令序列中期望得到的结果。 (旁注:当然可以尝试一些东西,看看会发生什么,但作为一般规则,除非你意识到更大的限制,否则永远不要尝试一些特别珍贵的东西。)

在[使用

git push --force
]之后,我们所有的1000+提交都消失了!

从技术上讲,它们实际上并没有“消失”。 你只是无法找到它们1Git需要提交的哈希ID来查找它。 从这个意义上说,Git 为我们(人类)提供了名称:分支名称、标签名称和其他此类名称。 这些名称具有关联的哈希 ID;如果它们是提交哈希 ID,那么我们可以直接通过该名称找到这些提交。 如果它们是标签对象哈希 ID,则可以让我们间接找到提交。2 由于每个提交在其元数据中存储了一个列表(通常只有一个元素长),因此我们只需要通过这种方式在某个链中找到

最后一个提交即可。 该提交将引导我们(和 Git)回顾历史。 这反过来就是你问题的答案:

我们可以做些什么来恢复我们的承诺吗?

如果您可以在您告诉 GitHub 用此其他提交哈希 ID 覆盖的分支名称上
找到最新提交的哈希 ID,则可以从 GitHub 取回这些其他提交。 这取决于两件事

关于

GitHub:

它们总是让您通过原始哈希 ID 访问任何提交。3

他们从不
    放弃
  1. 无法找到的提交。
  2. 大多数 Git 实现都具有永久弹出和忘记提交的技巧,通过从一些可直接查找的名称(如分支或标记名称)开始,没有人可以找到这些提交。 但 GitHub 特别针对托管存储库关闭了此功能(出于 GitHub 特定的原因)。 这意味着如果你能找到哈希 ID,你可以运行:
  3. git fetch origin <full-hash-id>:refs/heads/recovered
  4. 现在,在您的
local

存储库中,有一个名为

recovered
 的新分支,它指向您找到的提交。  如果这是链中的 
last

提交,您可以使用 git log recovered 查看所有提交。 如果这不是最后一次,您可以继续寻找稍后的提交。

请注意,拉取请求和其他项目存在于 GitHub 为您的 GitHub 存储库维护的 GitHub 特定附加数据库中。   这就是让您能够首先执行问题管理和拉取请求等事情的原因。  重要的是(对您来说),这些有时会包含哈希 ID,或者您可以通过其他链接找到哈希 ID,之后您可以使用上述类型的 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 左右开始,它们似乎相当不错可以使用。)

© www.soinside.com 2019 - 2024. All rights reserved.