【问题标题】:git add + git reset hard deleted working copy file - undo?git add + git reset 硬删除的工作副本文件-撤消?
【发布时间】:2014-01-17 22:59:02
【问题描述】:

我用 git add 添加了一个目录,发现里面有错误的文件,所以我用 git reset --hard 回到最新的提交,但我不知道 git 也会删除那些添加的文件在工作副本中。

有人知道我如何撤消此操作吗?

【问题讨论】:

标签: git git-reset


【解决方案1】:

当您git add 一个文件时,它会被添加到对象数据库和索引中。运行git reset 更新了索引和工作目录,但它没有从对象数据库中删除这些文件。它们仍然是无根(“悬空”)对象。您可以运行 git 文件系统检查器 git fsck 来查看哪些项目是“悬空的”。您应该会看到如下报告:

% git fsck
dangling blob 1ff0c423042b46cb1d617b81efb715defbe8054d
dangling blob 1bc915c5cb7185a9438de28a7b1a7dfe8c01ee7f
dangling blob a8c86221b400b836010567cc3593db6e96c1a83a
dangling blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e
dangling blob 21a96a98ed84d45866e1de6e266fd3a61a4ae9dc
... etc ...

如果您也碰巧有一棵悬空树,则可以将文件名恢复为 blob ID 映射。如果你有一些悬空的树:

dangling tree 57623d711c18d819831f24a9456f0660e9dbe596

然后你可以通过运行git ls-tree 命令来显示树的内容:

% git ls-tree 57623d711c18d819831f24a9456f0660e9dbe596
100644 blob 21a96a98ed84d45866e1de6e266fd3a61a4ae9dc file1.txt
100644 blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e file2.txt

这表明 blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e 最初添加为 file1.txt。但是,很可能您没有将树添加到对象数据库中,您需要检查每个文件以确定您希望将其保存在何处。

您可以使用git cat-file 命令获取 blob 的内容。比如保存到recovered.bak:

% git cat-file blob 46ff0854663aeb2182b9838c8da68e33ac23bc1e  > recovered.bak

【讨论】:

  • 我认为git add只是将文件添加到索引中,并且需要git commit才能将索引中的文件添加到对象数据库中。
  • @WayneConrad 将 blob 添加到索引将继续并将其放入对象数据库和索引中。对于这些类型的情况非常方便,因此您可以在修改工作目录后签出索引。
  • (另外,由于您必须对其进行哈希计算以计算要放入索引的对象ID,因此您最好将其放入对象数据库中,这样您就不必哈希提交时再次提交该文件。)
猜你喜欢
  • 2012-09-27
  • 2014-06-13
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-06
  • 2010-10-16
  • 2015-09-15
相关资源
最近更新 更多