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

时间:2011-08-26 10:43:29

标签: git

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

问题是:我不知道何时删除它以及它在哪条路径上。

如何存在此文件的提交?

10 个答案:

答案 0 :(得分:1320)

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

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

如果你知道文件所在的路径,你可以这样做:

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

这应该显示触及该文件的所有分支中的提交列表。然后,您可以找到所需文件的版本,并将其显示为...

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

或者将其恢复为您的工作副本:

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

请注意插入符号(^),它将之前的结帐到标识的那个,因为在<SHA>提交时,文件被删除,我们需要查看上一次提交以获取已删除文件的内容

答案 1 :(得分:352)

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

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

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

git log --all -- FILEPATH

显示已删除文件的差异

git show COMMIT_ID -- FILE_PATH

请记住,您可以使用>(例如

)将输出写入文件
git show COMMIT_ID -- FILE_PATH > deleted.diff

答案 2 :(得分:35)

无法编辑已接受的回复,因此请将其添加为答案

要在git中恢复文件,请使用以下内容(注意SHA之后的'^'符号)

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

答案 3 :(得分:24)

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

Prelim。:通过踩到git root避免混淆

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

> cd <project-root>
  1. 查找完整路径

      

    git log --diff-filter = D --summary | grep删除| grep MyFile

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

  2. full/path/to/MyFile.js是路径&amp;你要找的档案。

    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. 签出文件

    3. 如果您选择第一个列出的提交(最后按时间顺序排列,此处为bd8374c),则无法找到该文件,因为该文件已在该提交中删除。

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

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

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

答案 4 :(得分:22)

@Amber给出了正确答案!再补充一点,如果你不知道文件的确切路径,你可以使用通配符!这对我有用。

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

答案 5 :(得分:16)

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

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

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

答案 6 :(得分:15)

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

答案 7 :(得分:2)

摘要:

  1. 第1步

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

  1. 第2步

您可以在删除文件之前从提交中恢复文件

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

答案 8 :(得分:2)

这是我的解决方案:

git log --all --full-history --oneline -- <RELATIVE_FILE_PATH>
git checkout <COMMIT_SHA>^ -- <RELATIVE_FILE_PATH>

答案 9 :(得分:1)

如果您想查看所有已删除文件的import multiprocessing as mp def foo(q): q.put('hello') if __name__ == '__main__': mp.set_start_method('spawn') q = mp.Queue() p = mp.Process(target=foo, args=(q,)) p.start() print(q.get()) p.join()

以及相关的 size

SHA

添加-p也可以查看内容

git log --all --stat --diff-filter=D --oneline

要缩小到任何文件,只需通过管道连接到 grep 并搜索文件名

git log --all --stat --diff-filter=D -p

如果您知道文件在哪里,您可能也会喜欢这个

git log --all --stat --diff-filter=D --oneline | grep someFileName