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


154

有时会有几个更改的文件以及一些新的,删除的和/或重命名的文件。这样做时git diffgit-log我想忽略它们时,可以更好地发现所做的修改。

实际上,最好列出新文件和已删除文件的名称而不包含其内容。对于重命名为“新”的“旧”,我想选择地获得“旧”和“新”之间的区别。

Answers:


217

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

我使用--diff-filter=M了很多方法,将diff输出限制为仅内容修改。

要检测重命名和副本并在diff输出中使用它们,可以分别使用-M-C以及的RC选项--diff-filter


3
与之配合使用git log将导致它完全忽略仅添加和/或删除文件的提交。
qqx

7
有没有一种方法实际上仅排除一种类型的数据?像--diff-filter=!D
Kamil Dziedzic 2014年

24
@Kamil是的,有。从文档中引用:Also, these upper-case letters can be downcased to exclude. E.g. --diff-filter=ad excludes added and deleted paths.
LambdaCruiser

62
  • 正式文件:
--diff-filter=[(A|C|D|M|R|T|U|X|B)…​[*]]

仅选择已更改(T)是未合并(U),是未知(X)或配对已损坏(B)。可以使用过滤器字符的任何组合(包括无)。

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

同样,这些大写字母可以小写以排除。例如--diff-filter = ad排除添加和删除的路径。

示例:仅显示添加,更改,修改的文件,不包括已删除的文件:

git diff --diff-filter=ACM

2
关于使用小写字母选项排除路径和使用大写字母选项包括路径的注意事项。
stuyam

-3

更新:接受的答案由查尔斯·贝利是正确的; 所需的功能已内置到git中。

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


git diff通过与进行比较,显示新文件和已删除文件/dev/null。编写(在我自己使用Perl时)寻找/dev/null并过滤出以下行直到下一个差异的东西应该不是很困难。然后git diff ... | the-filter

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


可以,但是这样我就放弃了仅在需要时才使用分页器(较少)的可能性,对吗?
maaartinus 2011年

@maaartinus:我想是这样;我没想到。(个人而言,我将git pager设置为“ cat”并... | less显式使用。)您可能会看到less-E-F选项(尽管在我的系统上它不允许我查看输出)。
基思·汤普森

好的,那很好,但是看看另一个答案。
maaartinus 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.