Git:如何在项目提交历史logging中search已删除的文件?

曾几何时,我的项目中有一个文件,现在我想能够得到。

问题是:我不知道我什么时候删除它,在哪个path上。

如何find该文件存在时的提交?

如果你不知道你可能使用的确切path

git log --all --full-history -- **/thefile.* 

如果你知道文件的path,你可以这样做:

 git log --all --full-history -- <path-to-file> 

这应该显示所有分支触及该文件的提交列表。 然后,你可以find你想要的文件的版本,并显示它…

 git show <SHA> -- <path-to-file> 

或者将其还原到您的工作副本中:

git checkout <SHA>^ -- <path-to-file>

请注意脱字符号( ^ ),它在所标识的之前获取签出,因为在<SHA>提交时删除文件,我们需要查看以前的提交以获取删除的文件的内容

获取已删除文件的列表并复制已删除文件的完整path

 git log --diff-filter=D --summary | grep delete 

执行下一个命令来查找该提交的提交ID并复制提交ID

 git log --all -- FILEPATH 

显示已删除文件的差异

 git show COMMIT_ID -- FILE_PATH 

请记住,您可以使用> like将输出写入文件

 git show COMMIT_ID -- FILE_PATH > deleted.diff 

无法编辑接受的响应,因此在此添加它作为答案,

要在git中恢复文件,请使用以下命令(注意SHA后面的“^”号)

 git checkout <SHA>^ -- /path/to/file 

@琥珀给出了正确的答案! 还有一点,如果你不知道文件的确切path,你可以使用通配符! 这对我有效。

 git log --all -- **/thefile.* 

尝试使用其中一个查看器,例如gitk以便您可以浏览历史logging以查找该记忆的一半文件。 (使用gitk --all如果所有分支都需要的话)

其中一个很枯燥的事情是获取被删除文件的path,所以我只写了一个简单的命令,dev或git用户可以传递一个被删除的文件名并获取历史logging:

 git log --diff-filter=D --summary | grep filename | awk '{print $4; exit}' | xargs git log --all -- 

如果有人,可以改善命令,请做。

假设你想恢复一个名为MyFile的文件,但不确定它的path(或者它的扩展名):

Prelim: 通过步入git root避免混淆

一个不平凡的项目可能有多个名字相似或相同的目录。

 > cd <project-root> 
  1. find完整的path

    git log –diff-filter = D –summary | grep delete | grep MyFile

    delete mode 100644 full/path/to/MyFile.js

full/path/to/MyFile.js是您正在寻找的path和文件。

  1. 确定所有影响该文件的提交

    git log –oneline –follow – full / path / to / MyFile.js

    bd8374c Some helpful commit message

    ba8d20e Another prior commit message affecting that file

    cfea812 The first message for a commit in which that file appeared.

  2. 检出文件

如果你select了第一个列出的提交(最后一个按时间顺序排列,这里是bd8374c),那么这个文件将不会被find,因为它在提交中被删除了。

 > git checkout bd8374c -- full/path/to/MyFile.js `error: pathspec 'full/path/to/MyFile.js' did not match any file(s) known to git.` 

只要select前面的(追加一个插入符号)提交:

 > git checkout bd8374c^ -- full/path/to/MyFile.js