首页 > 解决方案 > Git 意外恢复了初始提交并删除了项目

问题描述

我不小心恢复了我的初始提交并将文件删除到我的项目中。我知道这应该是可恢复的,但不确定检索初始提交然后恢复到该初始提交的正确解决方案。

我从答案和运行时运行了一些命令git log --oneline。出现的唯一提交哈希是287e9ccb (HEAD, master) initial commit,这是我的空白目录,除了 node_modules 文件夹。显然,我运行了一个我认为会恢复到第一次提交的命令,并且可能会破坏它。

但是,我看到了要运行的附加命令git log --diff-filter=D --summary,它列出了所有已删除的文件。如何像在“初始提交”中一样保留那些已删除的文件?

编辑:运行git reflog,我得到:

287e9ccb (HEAD, master) master@{0}: reset: moving to 287e9ccb
25a289ec master@{1}: revert: Revert "initial commit" 
287e9ccb (HEAD, master) master@{2}: commit (initial): initial commit

标签: git

解决方案


reflog 显示您的存储库中只有两个提交:

  • 287e9ccb,这是您的初始提交
  • 25a289ec,这可能是运行的结果git revert 287e9ccb

初始提交将您提交的所有文件作为其快照。这个提交和之前的(不存在的)提交之间的区别在于,如果你向 Git 索要它,添加所有这些包含这些内容的文件

如果第二次提交是第一次的还原(正如其日志消息所暗示的那样),它包含撤消第一次提交的结果:即删除所有文件。所以第二次提交有一个空的源代码树。

Git 唯一永久/永久存储的东西1是提交本身。您使用的、可以查看和编辑的文件是临时的。提取提交会通过删除这些文件2并从您选择的提交中放入这些文件来替换这些文件。

这意味着至少就Git而言,你能得到的只有这两个提交:第一个提交和撤消第一个提交的提交。如果您需要未保存到这两个提交中的文件内容,则必须从 Git 以外的其他地方获取它们。


1即使提交本身也是永久的,因为它们可以通过哈希 ID 找到。通常,您(或 Git)将从分支或标签名称开始以获取一个特定的哈希 ID。这可以让你找到那个提交。然后,该提交包含其先前提交或提交的哈希 ID,这使 Git 可以找到父提交。父级包含另一个较早提交的哈希 ID,依此类推:这可以追溯到第一个提交,它是第一个,不记录任何较早的提交,然后 Git 停止。

换句话说,Git 是逆向工作的。您可以从分支名称中找到最后一次提交的哈希 ID ,然后 Git 向后工作。什么git reset是让您将分支名称移动到任何提交哈希 ID。从那里,你只能向后看。

reflog包含该名称过去持有的所有哈希 ID,无论如何,直到某个时候。(Reflog 条目最终会过期,因此 reflog 不会变得无限长。)因此,如果您重置提交但找不到它,则用于查找的名称的稍后提交的哈希 ID 将在您的 reflog 中.

不幸的是,git reset --hard这意味着请销毁我在索引和我的工作树中的文件的临时副本。如果您还没有提交它们,则无法将它们取回。

2 Git 使用了一些巧妙的方法来避免删除一个文件,然后用相同的内容替换它。由于大多数提交主要重复使用其他一些提交的文件,因此在从一个提交切换到另一个提交时可以节省大量时间。它还对某些构建系统(例如,make或其派生系统之一)有很大帮助。


推荐阅读