在Git中查找何时删除文件
我有一个Git仓库提供n个提交。
我有一个我需要的文件,而且这个文件曾经存在于版本库中,我突然寻找并思考“哦,那个文件去哪里了?”
是否有(一系列)Git命令会告诉我“文件really_needed.txt在提交n-13时被删除”?
换句话说,如果不查看每个单独的提交,并且知道我的Git repo对每个文件都进行了每次更改,我是否可以快速找到具有该文件的最后一个提交,以便我可以恢复它?
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文档有这么多话要说:
默认模式
将历史简化为解释树的最终状态的最简单历史记录。 最简单的,因为如果最终结果是相同的(即合并具有相同内容的分支)
这显然涉及何时删除我们想要的历史记录的文件,因为解释已删除文件的最终状态的最简单历史记录不是历史记录。 没有--full-history
git log
会存在风险,只会声称该文件从未创建过? 不幸的是,是的。 这是一个演示:
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
标志。
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
链接地址: http://www.djcxy.com/p/57221.html