为什么使用“git log --foo”无法查看已删除的文件foo的日志记录?

92

我的代码库经历了以下更改:

  1. ...一些与此无关的提交...
  2. 提交新文件foo,包含100行内容
  3. ...介于之间的提交,其中一些触及了foo...
  4. foo的内容插入到现有文件bar的顶部,并在同一次提交中执行git rm foo
  5. ...更多与此无关的提交...

现在我想查看已删除文件foo的日志记录。我看过的所有资料,包括SO上的资料都说我应该可以通过git log -- foo来实现,但是这个命令没有输出。

如果我找到删除foo的提交,我可以使用git log 1234abcd -- foo 来查看它的日志记录,因此我认为我的路径到foo不是问题所在。还要注意的是,git merge-base HEAD 1234abcd输出1234abcd [..。],因此我认为这应该证明提交从HEAD可达。请注意,我的工作目录中没有foo文件(显然,因为它已被删除)。在OS X上使用Git 1.7.1.1。

为什么git log -- foo对我不起作用,我该如何解决?谢谢!


6
你尝试过git log --follow -- foo或者git log --follow -M -- foo吗?(后者会强制进行重命名检测) - VonC
1
糟糕,我尝试过使用 --follow 选项,但是在查看 history 后我发现我已经使用 cd 命令切换到其他目录了,导致该路径无效。当我从正确的起始点尝试使用 git log --follow -- foo 命令时,它确实有效。我想 Git 将 foo 滚动到 bar 中被视为一种重命名操作?无论如何,非常感谢!如果您将其发布为答案,我很愿意给予您认可。 - user385804
1
很烦人,问题标题中的 -- 被改成了 ... - Cascabel
1个回答

123

你想在git log中使用--follow选项,该选项在man手册中被描述为:

Continue listing the history of a file beyond renames.

实际上,这不仅允许您查看重命名文件的历史记录,还允许您查看不再位于工作树中的文件的历史记录。因此,您应该使用类似以下命令:

git log --follow -- foo

更新:

Git 2.9+现在已默认为所有git diffgit log命令启用此功能:

"git diff" 和 "git log" 簇的面向终端用户的Porcelain层级命令默认启用重命名检测; 您仍然可以使用"diff.renames"配置变量来禁用此功能。

感谢x-yuri的提醒!


1
没有使用 --follow 参数也可以正常工作。我只需要添加 -- 就行了。我的 git 版本是 git-2.9.0 - x-yuri

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接