git - 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
解决方案
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
或其派生系统之一)有很大帮助。
推荐阅读
- tomcat - Spring-Boot 禁用响应头的传输编码
- c++ - 如何在 STL 容器中存储具有抽象模板类型的抽象模板类?
- c - 如果在循环中,指针是否会自行移动到数组中的下一行?
- swift - 如何在进入后台或恢复到前台时重定向到主屏幕
- codenameone - 代号:创建 PDF 文件
- python - 如何让 cv2 在 python3.6 上运行?
- php - 如何设置自定义路径来浏览和查看它的内容?
- r - imputation 数据框列表:使用调查包或 R 中的 MIcombine 计算分位数?
- c - 数组 c 上的分段错误
- python - 我将如何在 python 3.6 中解析这个 ret