首页 > 解决方案 > “git log --diff-filter=R”和“git log --find-renames”有什么区别?

问题描述

我在一个关于 git 命令的视频教程中学到了

git log --diff-filter=R --find-renames,

通过阅读文档,我得出的结论是

git log --diff-filter=R

应该产生相同的结果

git log --find-renames

并且第一个组合命令可能被认为是错字。

然而,当我在一个 repo 中尝试它时,两个命令分别产生了相同的结果,而在另一个 repo 中只有后一个产生了任何结果。此外,我找不到任何有关两者之间可能差异的文档。

除了您可以为每个命令添加不同的修饰符这一事实之外,有人可以告诉我这些命令之间的区别吗?

标签: git

解决方案


区别非常简单:

  • --find-renames选项使用默认的 50% 相似文件匹配阈值打开重命名查找机制。重命名机制在相当旧版本的 Git 中默认关闭,在较新版本的 Git 中默认打开,所以如果你有较新版本的 Git(并且没有更改默认值),添加--find-renames到你git diff的没有效果一点也不。1

  • --diff-filter=选项设置过滤器,告诉 Git在运行内部差异引擎后有选择地显示哪些文件。选择R告诉 Git显示那些检测到重命名的文件。

因此,如果您有一个古老版本的 Git,您需要两个选项(或参见脚注 1)才能仅查看重命名的文件,但对于现代 Git,--diff-filter=R除非该存储库的配置禁用重命名检测,否则该选项就足够了。


1还有几个配置旋钮,您可以使用git config或使用-c选项进行设置。这里最相关的是diff.renames, 可以设置为false, true, 或者copy或者copies有关更多详细信息,git config请参阅文档。Git 2.9.0 中的默认值从diff.rename更改falsetrue


推荐阅读