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

我有一个提交n提交的Git仓库。

我有一个我需要的文件,而这个文件曾经在版本库中,我突然想到,想:“哦,那个文件去哪里了?”

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

换句话说,没有看每一个单独的提交,并知道我的Git回购每个文件都有变化,我可以快速find最后一个提交该文件,所以我可以拿回来?

git log -- [file path]显示git log -- [file path]的变化,即使文件被删除也能正常工作。

 git log -1 -- [file path] 

查看哪个提交删除了一个文件

简短的回答:

 git log --full-history -- your_file 

将向您显示您的回购的历史中的所有提交,包括合并提交,触及your_file 。 最后一个(上)是删除文件的那个。

一些解释:

这里的--full-history标志很重要。 没有它,Git会在您要求文件日志时执行“历史简化”。 这些文档很详细地介绍了这个工作的细节,而且我没有从源代码中试图找出它所需要的勇气和勇气,但是git-log文档有这么多话要说:

默认模式

将历史简化为解释树的最终状态的最简单的历史。 最简单的,因为如果最终结果是相同的(即合并具有相同内容的分支)

这显然涉及何时删除我们想要的历史的文件,因为解释被删除文件的最终状态的最简单历史logging不是历史 。 是否有一个风险,没有 – --full-history git log只会声称该文件从来没有创build? 不幸的是,是的。 这是一个示范:

 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 

注意上面terminal转储中的git log -- bar如何导致没有输出; Git将历史“简化”成为一个从未有过的小说。 git log --full-history -- bar ,另一方面,给我们提交了创buildbar和提交,删除它。

要清楚:这个问题不仅仅是理论上的。 我只查看了文档,发现了--full-history标志,因为git log -- some_file在我试图追踪一个已删除的文件的实际存储库中失败了。 当您试图了解当前存在的文件如何处于当前状态时,历史简化有时可能会有所帮助,但在试图追踪文件删除时,通过隐藏您关心的提交。 对这个用例始终使用--full-history标志。

Git日志,但你需要前缀的path--

例如:

 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 

我刚刚在这里添加了一个解决scheme(是否有办法在git中列出存储库中的所有已删除的文件?)通过使用正则expression式find已删除文件的提交:

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

这将返回名为some_dir (级联)的目录中删除的所有内容。 任何sed正则expression式那里\/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 }