查找在Git中删除文件的时间

Joh*_*tta 932 git

我有一个带有n次提交的Git存储库.

我有一个我需要的文件,以前曾经在存储库中,我突然寻找并想"哦!那个文件去哪了?"

是否有(系列)Git命令会告诉我"在提交n-13时删除了文件really_needed.txt"?

换句话说,如果不查看每个单独的提交,并且知道我的Git repo对每个文件进行了每次更改,我是否可以快速找到该文件的最后一次提交,以便我可以将其恢复?

vog*_*lla 1005

git log --full-history -- [file path] 显示文件的更改,即使文件已删除也能正常工作.

例:

git log --full-history  -- myfile
Run Code Online (Sandbox Code Playgroud)

如果你想只看到最后一次提交,删除文件另外使用-1,例如, git log --full-history -1 -- [file path]

请参阅哪个提交删除了文件

  • 我能够使用`git log - */<< filename >>搜索.<<文件扩展名>>`不知道整个文件路径. (63认同)
  • 是否可以搜索模式?我忘记了文件的全名=(也许有可能得到所有删除的日志? (14认同)
  • 如果这给你一个合并提交,请添加“--no-merges”。无论哪种方式,您可能还需要添加“-p”来查看提交的内容。 (7认同)
  • 在这里找到它:http://stackoverflow.com/questions/6017987/is-there-a-way-in-git-to-list-all-deleted-files-in-the-repository (6认同)
  • 请注意,如果您使用PowerShell,则必须转义连字符:git log' - '[文件路径].希望这可以和其他人一样咬牙切齿. (6认同)
  • 如果此命令没有提供任何信息,请验证您是否位于 git 存储库的根文件夹中。 (4认同)
  • @MERose方括号用作真实文件路径的占位符。 (2认同)
  • 对我不起作用。目前(经过一些困难的操作)git 说某个文件,我们称之为“foo/bar.php”未跟踪(它在“git status”中显示为新的未跟踪文件),但我知道这是一个旧的事实和重要文件,没有理由将其删除。您给出的命令向我显示了该文件的两次提交,一次添加了它,一次修改了它。它不显示删除它的提交 - 并且必须有一个删除它的提交,否则它不会被取消跟踪! (2认同)

Mar*_*ery 220

简短回答:

git log --full-history -- your_file
Run Code Online (Sandbox Code Playgroud)

将显示您的回购历史记录中的所有提交,包括合并提交your_file.最后一个(顶部)是删除文件的那个.

一些解释:

--full-history这里的旗帜很重要.没有它,Git会在您询问文件日志时执行"历史简化".文档详细介绍了它的确切运作方式,我缺乏尝试从源代码中弄清楚所需的勇气和勇气,但是git-log文档有很多话要说:

默认模式

将历史简化为最简单的历史,解释树的最终状态.最简单的,因为如果最终结果相同(即合并具有相同内容的分支),它会修剪一些侧分支

删除我们想要的历史记录的文件时,这显然是有意义的,因为解释已删除文件的最终状态的最简单历史记录不是历史记录.有没有风险,git log没有--full-history简单地声称文件永远不会创建?不幸的是,是的.这是一个演示:

mark@lunchbox:~/example$ git init
Initialised empty Git repository in /home/mark/example/.git/
mark@lunchbox:~/example$ touch foo && git add foo && git commit -m "Added foo"
[master (root-commit) ddff7a7] Added foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 foo
mark@lunchbox:~/example$ git checkout -b newbranch
Switched to a new branch 'newbranch'
mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"
[newbranch 7f9299a] Added bar
 1 file changed, 0 insertions(+), 0 deletions(-)
 create mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"
rm 'foo'
[master 7740344] Deleted foo
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 foo
mark@lunchbox:~/example$ git checkout newbranch
Switched to branch 'newbranch'
mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"
rm 'bar'
[newbranch 873ed35] Deleted bar
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 bar
mark@lunchbox:~/example$ git checkout master
Switched to branch 'master'
mark@lunchbox:~/example$ git merge newbranch
Already up-to-date!
Merge made by the 'recursive' strategy.
mark@lunchbox:~/example$ git log -- foo
commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery 
Date:   Tue Jan 12 22:50:50 2016 +0000

    Deleted foo

commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery 
Date:   Tue Jan 12 22:50:19 2016 +0000

    Added foo
mark@lunchbox:~/example$ git log -- bar
mark@lunchbox:~/example$ git log --full-history -- foo
commit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37c
Merge: 7740344 873ed35
Author: Mark Amery 
Date:   Tue Jan 12 22:51:36 2016 +0000

    Merge branch 'newbranch'

commit 77403443a13a93073289f95a782307b1ebc21162
Author: Mark Amery 
Date:   Tue Jan 12 22:50:50 2016 +0000

    Deleted foo

commit ddff7a78068aefb7a4d19c82e718099cf57be694
Author: Mark Amery 
Date:   Tue Jan 12 22:50:19 2016 +0000

    Added foo
mark@lunchbox:~/example$ git log --full-history -- bar
commit 873ed352c5e0f296b26d1582b3b0b2d99e40d37c
Author: Mark Amery 
Date:   Tue Jan 12 22:51:29 2016 +0000

    Deleted bar

commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ec
Author: Mark Amery 
Date:   Tue Jan 12 22:50:38 2016 +0000

    Added bar
Run Code Online (Sandbox Code Playgroud)

注意git log -- bar上面的终端转储如何导致字面上没有输出; Git将历史"简化"为一个bar从未存在过的小说.git log --full-history -- bar另一方面,它为我们提供了创建bar的提交和删除它的提交.

需要明确的是:这个问题不仅仅是理论问题.我只是查看文档并发现了--full-history标志,因为git log -- some_file我在一个真正的存储库中失败了,我试图跟踪已删除的文件.当你试图理解当前存在的文件是如何处于当前状态时,历史简化有时会有所帮助,但是当试图追踪文件删除时,更有可能通过隐藏你关心的提交来搞砸你.始终使用--full-history此用例的标志.

  • 请注意,这仅搜索与当前分支相关的历史记录(不是“整个回购历史记录”)...即,如果文件尚未在当前分支中删除,但已在另一个分支中,则不会找到删除提交。您必须位于文件已被删除的任何分支_上。考虑起来也许很明显,但是起初让我很感兴趣。 (3认同)
  • 这个答案有效。但从“git log”输出本身来看,最后一次提交已**删除**该文件并不明显。我还尝试了 `git log --name-status --full-history -- file_name` 和 `git log -p --stat --full-history -- file_name`,但都没有明确表明该文件已在最新提交。这似乎是一个错误。 (2认同)

dan*_*iel 83

Git日志但你需要在路径前加上 --

例如:

dan-mac:test dani$ git log file1.txt
fatal: ambiguous argument 'file1.txt': unknown revision or path not in the working tree.

dan-mac:test dani$ git log -- file1.txt
 commit 0f7c4e1c36e0b39225d10b26f3dea40ad128b976
 Author: Daniel Palacio <danpal@gmail.com>
 Date:   Tue Jul 26 23:32:20 2011 -0500

 foo
Run Code Online (Sandbox Code Playgroud)


est*_*ani 29

我只是增加了一个解决方案在这里(有没有在git的办法列出所有被删除的文件在仓库中?),通过使用正规式查找被删除的文件的提交:

git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'
Run Code Online (Sandbox Code Playgroud)

这将返回名为some_dir(cascading)的目录中删除的所有内容.任何sed正则表达式都在那里\/some_dir\/.

OSX(感谢@triplee和@keif)

git log --diff-filter=D --summary | sed -n -e '/^commit/h' -e '\:/:{' -e G -e 's/\ncommit \(.*\)/ \1/gp' -e }
Run Code Online (Sandbox Code Playgroud)


Fab*_*lla 19

这个命令对我不起作用:

git log --full-history -1 -- [file path]
Run Code Online (Sandbox Code Playgroud)

这是有效的命令:

git log --follow -- [file path]
Run Code Online (Sandbox Code Playgroud)


Aki*_*kif 9

You can find the last commit which deleted file as follows:

git rev-list -n 1 HEAD -- [file_path]
Run Code Online (Sandbox Code Playgroud)

此处提供更多信息

  • 这个解决方案对我有用。接受的解决方案没有。 (8认同)
  • 对我来说也是如此,这个解决方案效果很好,而接受的答案则不然。非常感谢,很棒的提示! (6认同)
  • 这对我也有用。被赞成的答案包括一堆由于某种原因实际上并未触及文件的提交。无论如何,谢谢@Akif (6认同)
  • 请注意,模式匹配在这里也起作用。例如: `git rev-list -n 1 HEAD -- '*myfile.txt'` (5认同)
  • 最初提议的解决方案对我不起作用,但是这个对我有用。 (2认同)
  • 这个命令也对我有用。谢谢。 (2认同)

gTi*_*cai 7

这对我有用:

git 日志 -- **/Myfile.cs

如果包含--full-history开关,则会显示很多与文件无关的更改。不知道为什么。


Eri*_*uff 5

尝试:

git log --stat | grep file
Run Code Online (Sandbox Code Playgroud)