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


Git: How to find a deleted file in the project commit history?

从前,我的项目中有一个文件,我现在想能够得到。

问题是:我不知道什么时候删除了它,它在哪条路径上。

当这个文件存在时,我如何定位它的提交?


如果您不知道可以使用的确切路径

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

如果知道文件的路径,可以执行以下操作:

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

这应该显示所有接触该文件的分支中的提交列表。然后,您可以找到所需文件的版本,并用…

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

或者用以下方法将其还原到您的工作副本中:

git checkout ^ --

请注意插入符号(^在标识的签出之前获得签出,因为在提交文件时,文件被删除,我们需要查看上一个提交以获得已删除文件的内容。


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

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

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

1
git log --all -- FILEPATH

显示已删除文件的差异

1
git show COMMIT_ID -- FILE_PATH

记住,您可以使用>之类的工具将输出写入文件。

1
git show COMMIT_ID -- FILE_PATH > deleted.diff


无法编辑已接受的响应,因此在此处将其添加为答案,

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

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


假设您想要恢复一个名为MyFile的文件,但它的路径(或扩展名)不确定:

prelim.:通过单步执行git根来避免混淆

一个重要的项目可能有多个同名或相同的目录。

1
> cd <project-root>
  • 找到完整的路径


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

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

  • full/path/to/MyFile.js是您要查找的路径和文件。

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


    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.

  • 签出文件

  • 如果选择第一个列出的提交(按时间顺序最后一个提交,这里是bd8374c),将找不到该文件,因为该文件已在该提交中删除。

    1
    2
    3
    > git checkout bd8374c -- full/path/to/MyFile.js

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

    只需选择前面的(附加插入符号)提交:

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

    @琥珀给出了正确的答案!只需再添加一个,如果您不知道文件的确切路径,可以使用通配符!这对我很有用。

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


    这里的一个烦人的事情是获取已删除文件的路径,所以我只写了一个简单的命令,在这里一个dev或git用户可以传递一个已删除的文件名并获取历史记录:

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

    如果有人,可以改进指挥,请做。


    尝试使用其中一个查看器,如gitk,这样您就可以浏览历史记录,找到记忆不足的文件。(如果所有分支机构都需要,使用gitk --all)


    总结:

  • 步骤1
  • 在已删除文件的历史记录中搜索文件的完整路径git log --diff-filter=D --summary | grep filename

  • 步骤2
  • 您可以在删除文件之前将其从提交中还原

    1
    2
    3
    4
    5
    6
    7
    8
    restore () {
      filepath="$@"
      last_commit=$(git log --all --full-history -- $filepath | grep commit | head -1 | awk '{print $2; exit}')
      echo"Restoring file from commit before $last_commit"
      gco $last_commit^ -- $filepath
    }

    restore my/file_path