在将文件添加到.gitignore后,如何从以前的提交中恢复这些文件?

3
我曾经有一个文件被Git跟踪,并且是Git历史记录中的几个提交之一。后来,我将该文件包含在.gitignore中。现在我想恢复这个文件。我尝试了git reset --hard <sha>git checkout <branch/remote/file/etc>,但这些命令都没有找回这个文件,它不会出现在工作目录中。
请注意,我可以在Git历史记录中看到这个文件。我可以查看我对它所做的更改,如果需要,我可以复制粘贴Git显示给我的内容。但是,如何从早期的提交历史记录中恢复此文件呢?重置和检出似乎对我不起作用,我怀疑是因为在将该文件提交到Git后,我将其包含在.gitignore中并进行了提交。
[更新]
我已经尝试删除.gitignore,但它仍无法恢复该文件。我重置到一个存在该文件且未在.gitignore中的提交,但它仍无法将其找回。

1
当您将此文件添加到.gitignore中时,是否也将其从存储库中删除? .gitignore无法控制从存储库中检出的内容,只能控制Git提供要添加到新提交的内容。 - Wolf
在我将它加入到.gitignore之前,我已经在Git中提交了大约10次。但后来我将其包含到.gitignore中并提交了.gitignore。直到现在我都没有意外地删除它。在我的工作目录中意外删除文件后,我没有进行任何提交。 - Seph
那么(根据我下面的回答),你可以简单地说:“git checkout HEAD -- path/to/file”,然后你就能够重新获得你的文件。 - Wolf
2个回答

2

尝试特定地检查该文件。使用你知道包含该文件的提交来执行此操作。

git checkout <commit> -- path/to/file

我遇到了一个错误:error: pathspec 'colors' did not match any file(s) known to git.。我使用的路径是相对于.git所在位置的。换句话说,该文件位于repo的根目录中,因此我执行了git checkout <sha> -- dirname。实际上,它是一个目录,而不是一个文件。 - Seph
除了意外删除该目录之外,您的工作目录中是否有其他更改? - Wolf
我尝试了克隆一个新的存储库并尝试checkoutreset,但是那个文件不会显示,并且使用checkout时会不断出现错误。 - Seph
等一下。从头克隆存储库(应该留下一个新的工作副本在“HEAD”处检出)没有让你恢复目录吗?你确定你没有提交删除操作吗?git log --stat 命令告诉你什么? - Wolf
我能够从更早的提交中找回文件。我仔细查看了我的git日志,我从未提交过删除该目录的操作。事实上,直到现在我都没有删除它。我从硬备份中恢复了缺失的部分。 - Seph

0

在运行命令之前尝试删除 .gitignore 文件(或将其移出存储库)。

类似于以下内容:

rm .gitignore
# If the reset doesn't work because of the change, you can add --force
git reset --hard <sha> 

我尝试过了,但还是没有任何进展。 - Seph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接