我有一个带有n个提交的Git存储库。
我有一个我需要的文件,它曾经在存储库中,我突然寻找并思考“哦!那个文件去哪里了?”
是否有一个(一系列)Git命令会告诉我“文件really_needed.txt在提交n-13时被删除”?
换句话说,如果不查看每个单独的提交,并且知道我的Git存储库有每个文件的每个更改,我可以快速找到具有该文件的最后一次提交,以便我可以取回它吗?
git日志,但您需要在路径前缀--
--
例如:
dan-mac:test dani$ git log file1.txtfatal: ambiguous argument 'file1.txt': unknown revision or path not in the working tree. dan-mac:test dani$ git log -- file1.txtcommit 0f7c4e1c36e0b39225d10b26f3dea40ad128b976Author: Daniel Palacio <danpal@gmail.com>Date: Tue Jul 26 23:32:20 2011 -0500 foo
我刚刚在这里添加了一个解决方案(git中有没有办法列出存储库中所有已删除的文件?),用于使用正则表达式查找已删除文件的提交:
git log --diff-filter=D --summary | sed -n '/^commit/h;/\/some_dir\//{G;s/\ncommit \(.*\)/ \1/gp}'
这将返回在名为some_dir(级联)的目录中删除的所有内容。\/some_dir\/所在的任何se正则表达式都可以。
some_dir
\/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 }
要显示更改文件的提交,即使文件已被删除,也请运行以下命令:
git log --full-history -- [file path]
如果您只想查看删除文件的最后一次提交,请在上面的命令之外使用-1:
-1
git log --full-history -1 -- [file path]
请参阅我的文章:哪个提交删除了一个文件。
git log --full-history -- your_file
将向您显示repo历史记录中的所有提交,包括触及your_file的合并提交。最后一个(顶部)是删除文件的那个。
your_file
这里的--full-history标志很重要。如果没有它,当你要求它提供文件的日志时,Git会执行“历史简化”。文档对这是如何工作的细节很轻,我缺乏尝试从源代码中弄清楚它所需的勇气和勇气,但是git-log文档有这么多话要说:
--full-history
默认模式 将历史简化为解释树的最终状态的最简单的历史。最简单的是因为如果最终结果相同(即合并具有相同内容的分支),它会修剪一些侧分支
将历史简化为解释树的最终状态的最简单的历史。最简单的是因为如果最终结果相同(即合并具有相同内容的分支),它会修剪一些侧分支
当我们想要的历史记录是删除的文件时,这显然是令人担忧的,因为解释已删除文件最终状态的最简单历史记录是没有历史。是否存在没有--full-history的git log会简单地声称该文件从未创建的风险?不幸的是,是的。这里有一个演示:
git log
mark@lunchbox:~/example$ git initInitialised 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 foo1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 foomark@lunchbox:~/example$ git checkout -b newbranchSwitched to a new branch 'newbranch'mark@lunchbox:~/example$ touch bar && git add bar && git commit -m "Added bar"[newbranch 7f9299a] Added bar1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 barmark@lunchbox:~/example$ git checkout masterSwitched to branch 'master'mark@lunchbox:~/example$ git rm foo && git commit -m "Deleted foo"rm 'foo'[master 7740344] Deleted foo1 file changed, 0 insertions(+), 0 deletions(-)delete mode 100644 foomark@lunchbox:~/example$ git checkout newbranchSwitched to branch 'newbranch'mark@lunchbox:~/example$ git rm bar && git commit -m "Deleted bar"rm 'bar'[newbranch 873ed35] Deleted bar1 file changed, 0 insertions(+), 0 deletions(-)delete mode 100644 barmark@lunchbox:~/example$ git checkout masterSwitched to branch 'master'mark@lunchbox:~/example$ git merge newbranchAlready up-to-date!Merge made by the 'recursive' strategy.mark@lunchbox:~/example$ git log -- foocommit 77403443a13a93073289f95a782307b1ebc21162Author: Mark AmeryDate: Tue Jan 12 22:50:50 2016 +0000 Deleted foo commit ddff7a78068aefb7a4d19c82e718099cf57be694Author: Mark AmeryDate: Tue Jan 12 22:50:19 2016 +0000 Added foomark@lunchbox:~/example$ git log -- barmark@lunchbox:~/example$ git log --full-history -- foocommit 2463e56a21e8ee529a59b63f2c6fcc9914a2b37cMerge: 7740344 873ed35Author: Mark AmeryDate: Tue Jan 12 22:51:36 2016 +0000 Merge branch 'newbranch' commit 77403443a13a93073289f95a782307b1ebc21162Author: Mark AmeryDate: Tue Jan 12 22:50:50 2016 +0000 Deleted foo commit ddff7a78068aefb7a4d19c82e718099cf57be694Author: Mark AmeryDate: Tue Jan 12 22:50:19 2016 +0000 Added foomark@lunchbox:~/example$ git log --full-history -- barcommit 873ed352c5e0f296b26d1582b3b0b2d99e40d37cAuthor: Mark AmeryDate: Tue Jan 12 22:51:29 2016 +0000 Deleted bar commit 7f9299a80cc9114bf9f415e1e9a849f5d02f94ecAuthor: Mark AmeryDate: Tue Jan 12 22:50:38 2016 +0000 Added bar
注意上面的终端转储中的git log -- bar是如何导致实际上没有输出的;Git正在将历史“简化”为bar从未存在过的虚构。另一方面,git log --full-history -- bar给了我们创建bar的提交和删除它的提交。
git log -- bar
bar
git log --full-history -- bar
需要明确的是:这个问题不仅仅是理论上的。我只查看了文档并发现了--full-history标志,因为git log -- some_file在我试图跟踪已删除文件的真实存储库中失败了。当你试图理解现有文件是如何处于当前状态时,历史简化有时可能会有所帮助,但是当试图跟踪文件删除时,它更有可能通过隐藏你关心的提交来欺骗你。对于这个用例,始终使用--full-history标志。
git log -- some_file
您可以找到删除文件的最后一次提交,如下所示:
git rev-list -n 1 HEAD -- [file_path]
更多信息可用这里
尝试:
git log --stat | grep file
这个命令对我不起作用:
这是有效的命令:
git log --follow -- [file path]
这对我有用:
git log -- **/ Myfile.cs
如果包含--完整历史开关,它会显示很多与文件无关的更改。不确定为什么。
如果不记得确切的文件名,可以对目录执行相同的操作。查找发生删除的提交并在此之前签出提交。
git log -- the/dir/where/things/got/deleted/
git log --full-history -- src/main/java/SomeFile.java找到的最新提交不包括我的文件删除。我在git log --full-history --stat --- src/main/java/SomeFile.java下找到了一个提交
git log --full-history -- src/main/java/SomeFile.java
git log --full-history --stat --- src/main/java/SomeFile.java
示例输出:
commit aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaMerge: bbbbb cccccAuthor: Geoff Langenderfer <geoff@gmail.com>Date: Thu Sep 15 13:08:28 2022 -0700 remove scala commit ddddddddddddddddddddddddddddddddddddddd <-- this is the one I wantedAuthor: Geoff Langenderfer <geoff@gmail.com>Date: Sun Sep 11 16:13:03 2022 -0700 unblock spark 3 src/main/java/SomeFile.java | 44 ---------------------------------1 file changed, 44 deletions(-)