在 GIT 中撤消删除

Posted

技术标签:

【中文标题】在 GIT 中撤消删除【英文标题】:Undo delete in GIT 【发布时间】:2012-03-17 16:11:28 【问题描述】:

我做了一些非常愚蠢的事情。 我使用 git commit(文件编辑 + 新文件)(C)进行了提交。 然后我修改了最后一次提交。 然后我使用git rm -r递归删除所有文件(!) 然后我又做了一个 git commit (C)。

A-B-C ↑ 掌握

有什么方法可以取消删除文件但保留我在第一次提交中所做的更改? (C) 我宁愿不要回到(B)。 我尝试了 git reset --soft head^,然后 git status 列出了我删除的文件,然后我做了 git checkout,但仍然没有运气。我什至不知道这是否可能。

【问题讨论】:

所以你想要你的提交 A 文件? 不,我想仍然在 C 上,但没有删除文件,只有我的文件编辑和文件添加。我的工作树中现在没有这些文件,它们已被删除。 【参考方案1】:

帮自己一个忙,不要像其他答案建议的那样做git checkout <hash> 并解决更多问题。

如果您已从工作目录中删除文件但尚未提交更改,请执行以下操作:

git checkout -f

注意:在执行此命令之前提交未提交的文件,否则您将丢失所有文件

删除的文件应该又回来了。

如果没有,并且如果您可以从 git reflog 找到您想要的提交(C 等 - 您的问题不清楚),只需执行 git reset --hard <hash from reflog> 即可。

【讨论】:

+1 您可以添加一个指向分离的头部问题的链接(如***.com/questions/3965676/why-did-git-detach-my-head/…),以说明 git checkout SHA1 答案的问题。 ORIG_HEAd 在这种情况下会有所帮助吗? (***.com/questions/964876/head-and-orig-head-in-git/…) 好的,所以这个答案实际上更好。 reset --hard to 让我留在我的主分支上,并且我没有处于“分离 HEAD”状态。在找回我丢失的数据的情况下,Sasha 的回答也很好。 除了恢复已删除的文件外,git checkout -f 还会丢弃您尚未暂存的所有其他更改,因此请注意。 最后一条评论需要突出显示。请注意,它不会像您想象的那样将自己限制在您的当前目录中,它会破坏您的整个存储库。哇。 用于选择性取消删除特定文件: git checkout -- 【参考方案2】:

如果我理解正确,你重写了提交 C。所以原始提交,我们称之为 C1 不能从你的提交图中访问,但它仍然存在(git 将所有提交保留一段时间)。使用git reflog 获取提交哈希并使用git checkout <hash> 或其他适当的命令来获取旧状态C1。

【讨论】:

还有一个问题。现在它说我处于“分离的 HEAD”状态。我如何才能回到我的“主”分支? 不客气。但是,我不理解否决票。一个 git reset --hard 可能更危险。目前尚不清楚发帖者是否修改了原始提交 C 并添加了他想要保留的更改。

以上是关于在 GIT 中撤消删除的主要内容,如果未能解决你的问题,请参考以下文章

如何从暂存区域中删除单个文件(撤消 git add)?

Git 撤消本地分支删除

git:撤消所有工作目录更改,包括新文件

如何撤消 git flow 功能完成?

如何撤消多个 git 提交? [复制]

如何在保留更改的同时撤消最后一次 git 提交? [复制]