如何使git-diff和git log忽略新建和删除的文件?

235
有时候会有一些被修改的文件和一些新、删除或者重命名的文件在一起。当执行 git diff 或者 git-log 命令时,我希望能够排除它们,这样我就可以更好地发现修改了哪些内容。
实际上,最好只列出新文件和删除文件的名称而不包括它们的内容。对于那些从“旧名称”改名为“新名称”的文件,我希望可以选择性地获取“旧名称”和“新名称”之间的差异。
4个回答

307

--diff-filter选项适用于diff和日志。

我经常使用--diff-filter=M,该选项将diff输出限制为仅内容修改。

要检测重命名和复制并在diff输出中使用它们,您可以分别使用-M-C,并与--diff-filter选项的RC选项一起使用。


3
当与git log一起使用时,这将使其完全忽略仅添加和/或删除文件的提交。 - qqx
15
有没有一种方法可以仅排除一种类型的数据?类似于“--diff-filter=!D”。 - Kamil Dziedzic
59
是的,有相关说明。文档中的引用如下: “此外,这些大写字母可以被小写以排除。例如,--diff-filter=ad 将排除添加和删除路径。” - LambdaCruiser

124

官方文档

--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

只选择已添加(A)、已复制(C)、已删除(D)、已修改(M)、已重命名(R)、类型更改(即常规文件、符号链接、子模块等)(T)、未合并(U)、未知(X)或已破坏配对(B)的文件。 可以使用任意组合的过滤字符(包括无)。

当将 *(全部或无)添加到组合中时,如果比较中存在与其他条件匹配的文件,则选择所有路径;如果没有与其他条件匹配的文件,则不选择任何内容。

此外,这些大写字母可以转换为小写以进行排除。例如,--diff-filter=ad 排除已添加和已删除的路径。

示例:仅显示已添加、已复制、已修改的文件:

git diff --diff-filter=ACM

10
使用小写字母选项来排除路径,使用大写字母选项来包含路径是一个不错的提示。 - stuyam

6

此外,这些大写字母可以转换为小写字母以排除。
例如:--diff-filter=ad 排除添加和删除的路径。

在您的情况下,git diff --diff-filter=ad 可以工作,但请确保不要在同一个筛选器中使用大小写字母,除非您使用 Git 2.36 (Q2 2022)。

"git diff --diff-filter=aR"(man) 现在被正确解析。

请查看提交75408ca, 提交4d4d4ea, 提交d843e31 (2022年1月28日) 由Johannes Schindelin (dscho)完成。
(由Junio C Hamano -- gitster --合并于提交9a16099, 2022年2月16日)

diff-filter: 在查找负位时更加小心

Signed-off-by: Johannes Schindelin

--diff-filter=<bits>选项允许按照某些标准过滤差异,例如R仅显示重命名的文件。
它还支持通过小写字母否定过滤器,即
r显示除了重命名文件之外的所有内容。

然而,当尝试确定git diff(man)是否应该从所有差异过滤器开始时,代码有点过于热心,因为用户提供了一个小写字母:如果--diff-filter参数以大写字母开头,我们不能从所有位开始。

更糟糕的是,可以在多个单独的选项中指定差异过滤器,例如--diff-filter=AM [...] --diff-filter=m

让我们独立累积包含/排除过滤器,并仅在解析所有选项后特殊处理“仅指定排除过滤器”的情况。


-3

更新:Charles Bailey的被接受的答案是正确的,所需功能已经内置于git中。

我将保留此答案,因为它可能为未内置于git中的功能提供思路。


git diff 通过将文件与 /dev/null 进行比较来显示新文件和已删除的文件。编写一些东西(我会使用 Perl)查找 /dev/null 并过滤出以下行,直到下一个差异,这应该不太难。然后使用 git diff ... | the-filter

重命名的文件是另一回事;对此我还没有一个好的答案。


这样做是可以的,但如果需要的话,我将失去使用分页器(less)的可能性,不是吗? - maaartinus
@maaartinus:我想是这样的;我没有想到过。 (个人而言,我将我的git pager设置为“cat”,并明确使用... | less。)您可以查看less-E-F选项(尽管在我的系统上它不允许我查看输出)。 - Keith Thompson
好的,没问题,但是看看其他的答案。 - maaartinus

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