假设我在Git存储库中。我删除一个文件并提交更改。我继续工作,并做出更多承诺。然后,我发现删除该文件后需要恢复该文件。

我知道我可以使用gitcheckout<commit>--filename.txt签出文件,但我不知道该文件何时被删除。

如何查找删除给定文件名的提交?如何将该文件恢复到工作副本中?


当前回答

我必须从一个特定的提交中恢复一堆已删除的文件,我用两个命令进行管理:

git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git checkout <rev>^ -- 
git show <rev> --diff-filter=D --summary --name-only --no-commit-id | xargs git reset HEAD 

(注意每个命令末尾的尾随空格。)

这些文件已添加到.gitignore文件中,然后用gitrm清除。我需要恢复这些文件,但随后又将其拆下。我有数百个文件要恢复,像其他示例中那样手动为每个文件键入内容太慢了。

其他回答

要还原已删除并提交的文件,请执行以下操作:

git reset HEAD some/path
git checkout -- some/path

它在Git 1.7.5.4版本上进行了测试。

我有这个解决方案。

使用以下方法之一获取删除文件的提交id。git-log--grep=*word*git-log-剑git-log|grep--context=5*word*git-log--stat|grep--context=5*word*#建议您记住任何事情您应该得到以下内容:

提交bfe68bd117e1091c96d2976c99b3bcc8310bebe7作者:Alexander奥尔洛夫日期:2011年5月12日星期四23:44:27+0200替换了已弃用的GWT类-gwtI18nKeySync.sh,一个过时的(?,被Maven目标取代)I18n生成脚本提交3ea4e3af253ac6fd1691f6bb89c964f54802302作者:Alexander奥尔洛夫日期:2011年5月12日星期四22:10:22+0200

3.现在使用提交id bfe68bd117e1091c96d2976c99b3bcc8310bebe7执行以下操作:

git checkout bfe68bd117e1091c96d2976c99b3bcc8310bebe7^1 yourDeletedFile.java

由于提交id引用了文件已被删除的提交,您需要引用bfe68b之前的提交,可以通过添加^1来完成。这意味着:在bfe68b之前提交给我。

查找删除文件的提交:

git log --diff-filter=D --oneline -- path/to/file | cut -f -d ' '

样本输出:

4711174

从Git 2.23开始,实际上有一个restore命令。它仍然是实验性的,但为了恢复您在提交中删除的内容(在本例中为4711174),您可以键入:

git restore --source=4711174^ path/to/file

注意提交id之后的^,因为我们希望从删除文件之前的提交中恢复一些内容。

--source参数告诉restore命令在哪里查找要还原的文件,它可以是任何提交,甚至可以是索引。

参见:git 2.23.0的git restore doc

我也有同样的问题。在不知情的情况下,我创建了一个悬空的承诺。

列出悬空提交

git fsck—找到丢失

检查每个悬空提交

git reset--hard<commit id>

当我移动到悬空提交时,我的文件再次出现。

git状态,原因如下:

“HEAD从<commit id where it detached>分离”

这是我发现的最简单的解决方案,如果您只想在master中恢复相同的文件:

git checkout master -- path/to/File.java