【问题标题】:Git-reset --hard while no commits yet [duplicate]Git-reset --hard 虽然还没有提交[重复]
【发布时间】:2018-09-21 05:28:58
【问题描述】:

git reset 的行为是什么,特别是 git reset --hard,而树还没有提交? (就在git init 之后)。它只是删除所有内容?

在编辑 .gitignore 时搞砸了。 在首次提交之前,我尝试对 .gitignore 应用新的更改。所以,要忽略一些新文件,我必须清理索引,然后再次创建git add .。我猜,普通的git reset 不会搞砸,但我用了git reset --hard,因为我的天才。

现在,项目文件夹只包含带有内容的.git文件夹,以及项目的整个文件夹结构,没有任何文件。为什么?

我可以恢复文件吗?在这种情况下我有什么选择?

UPD

@kowsky 为我指出了正确的方向 - in this answer 他们解释了如何恢复临时存储在 .git/objects(悬空 blob)中的文件,就像我的情况一样(特别是使用 this 工具)。 我恢复了一切,谢谢!

【问题讨论】:

  • 如果您没有提交这些更改,那么这些文件几乎会丢失并且无法恢复。您几乎可以始终恢复已提交的数据,但在这种情况下您没有,所以我认为这是不可能的。
  • git status 为您提供了取消暂存文件的正确命令(它是 git reset HEAD <file>;请注意,--hard 不包括在内)。 git reset --hard 使索引和工作树与您作为参数传递的提交相同。由于您还没有任何提交,因此您的存储库是空的,并且工作树已同步到该存储库。你的文件不见了。
  • 你应该这样回答。

标签: git git-reset


【解决方案1】:

让我们澄清一下。

您通过运行 git init 初始化了您的 git 本地存储库,这确实创建了 .git 文件夹,所有 git 工具和对象都将存储在该文件夹中。

当您对一个全新的空文件夹进行更改时,这些文件将无法跟踪,并且通过使用 git add . 命令添加它们,您所做的就是复制这些更改(自从您将 . 放在命令前面)从您的工作目录到暂存区。此时您的工作目录和暂存区确实包含相同的文件。

您没有提交这些更改,因此当您运行 git reset --hard HEAD 时,您基本上是在说“将所有内容(暂存区、工作区、提交区)作为提交 HEAD 指向的内容,在这种情况下确实没有在这种情况下,它的作用是删除所有内容。

检查this 的回答,看看您是否可以取回这些文件。

为避免下次出现这种删除,我建议使用git reset --softgit reset 这是git reset --mixed 的缩写

This 可能会更深入地解释事情。

【讨论】:

  • 好的,谢谢,我明白了
【解决方案2】:

git reset 的行为是什么,特别是git reset --hard,而 树还没有提交?

如果您添加文件然后使用git reset --hard,您的文件将被删除。不会触及未跟踪的文件。

我可以恢复文件吗?

如果您从未添加或提交过文件,git 对它们一无所知并且无法恢复它们。但是,可以恢复所有添加的文件。 Herehere 是关于如何恢复它们的答案。

【讨论】:

  • 我使用了git add .。正如我所说,没有做出任何承诺。 “你为什么要清理索引” - 我在更新 gitignore 后清理了索引,以应用更改。
  • "您在目录中创建了哪些文件?" - 只是简单的文本文件。为什么重要?
  • 这很重要,因为我想尽可能地了解正在发生的事情。我编辑了我的答案,并在Recover once staged but not committed files?上添加了一个答案链接。
  • 哦,是的,现在在这个链接之后,我明白你为什么询问文件类型了。这是一个 python 项目,所以有纯文本文件 + virtualenv 文件夹(带有一些二进制文件)+ sqlite 数据库。但是文本文件就是我需要的一切。
  • this question 的回答实际上可能更有帮助。
猜你喜欢
  • 2015-09-15
  • 2015-12-03
  • 2014-09-03
  • 1970-01-01
  • 2018-11-02
  • 2018-01-13
  • 2015-01-10
  • 2011-12-19
  • 2017-06-04
相关资源
最近更新 更多