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

时间:2011-07-27 04:23:46

标签: git

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

我有一个我需要的文件,而且曾经存在于存储库中,我突然想到并想“哦!那个文件去哪了?”

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

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

7 个答案:

答案 0 :(得分:879)

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

示例:

git log --full-history  -- myfile

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

请参阅Which commit deleted a file

答案 1 :(得分:195)

简答:

git log --full-history -- your_file

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

一些解释:

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

  

默认模式

     

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

当我们想要的历史文件被删除时,这显然很有用,因为解释已删除文件的最终状态的最简单历史记录是 no history 。是否存在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

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

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

答案 2 :(得分:81)

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

答案 3 :(得分:21)

我刚刚在(is there a way in git to list all deleted files in the repository?)添加了一个解决方案,用于通过使用正则表达式查找已删除文件的提交:

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

这将返回名为some_dir的目录中删除的所有内容(级联)。 <{1}}所在的任何sed正则表达式都可以。

OSX (感谢@triplee和@keif)

\/some_dir\/

答案 4 :(得分:0)

这在OSX上对我有用:

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

答案 5 :(得分:0)

您可以找到删除文件的最后一次提交,如下所示:

git rev-list -n 1 HEAD -- [file_path]

其他信息可用here

答案 6 :(得分:0)

尝试:

git log --stat | grep file