在git中没有真正删除过的东西吗?

时间:2010-12-29 23:51:03

标签: git

我正在学习git,通常我对VCS有点怀疑,因为我很难习惯它们。

我删除了一个名为“experimental”的分支,其中包含一些tmp文件,我看到我的工作目录中删除了这些文件,所以我摸不着头脑,想知道这是否正常,我是否可以把它带回去,以防我再次需要它等等

我发现SHA提交了tmp文件并使用提供的sha重新创建了分支,并再次查看了所有文件及其当前内容。

我提交后,我在工作目录中所做的一切都可以恢复吗?

对许多人来说,这似乎是一个愚蠢的问题,但它有点引起我的兴趣,所以我想了解极限

4 个答案:

答案 0 :(得分:7)

如果您已对文件提交了相应的更改,则几乎所有操作都可以撤消。即使您强制删除分支或执行硬重置,也可以使用git refloggit fsck找到松散的提交对象。

然而git gc偶尔会清除松散的物体,因此一段时间后无法恢复它们。

答案 1 :(得分:2)

  

我在工作中所做的一切   我可以恢复目录   提交吗?

是的,你可以。例如,尝试git reflog。这将为您提供一份提交列表 在当前的分支机构。选择一个sha1 sum,然后键入git checkout 45db2a...。检查该提交。如果您想进行更改,请务必从git checkout HEADgit checkout -b newbranch开始。

您还可以使用git在当前HEAD之上挑选这些提交(即如果它们在不同的分支中完成,则可以将它们拉入)。 This问题比我能更好地讨论它。

答案 2 :(得分:2)

任何严肃的VCS的要点是以永久和不可变的方式保持项目的整个历史。因此,您可以随时对您的工作进行任意修改。

git在存储方面有一种特殊的行为,因为它可以在没有引用的情况下删除对象。参考文献是:

  • 分支的每个HEAD
  • 标签(我不确定未引用的带注释标签是否仍可作为有效参考)
  • 另一个提交引用的每个提交
  • 分支reflog的内容

这意味着保留了作为分支一部分的所有提交,以及标记的每个对象(=主要是提交)。每个分支上还有一个所谓的reflog(除非取消激活),其中git保留对你在前几天创建的所有对象的引用。当任何分支,标记或reflog都没有引用某个对象时,git gc会将其从数据库中删除。这是典型的情况,当你创建一个黑客分支,在那里提交了一些东西,并删除了这个分支而没有将它合并到另一个分支。

答案 3 :(得分:1)

git reset --hard可以不可逆转地删除更改