如何使用--diff-filter=
通过git diff
过滤器
要获取所有已更改文件的列表,排除所有已删除(通过小写d
过滤器)的文件,请使用--diff-filter=d
,像这样:
git diff --name-only --diff-filter=d from_commit_hash
git diff --name-only --diff-filter=d from_commit_hash to_commit_hash
git diff --name-only --diff-filter=d from_commit_hash..to_commit_hash
git diff --name-only --diff-filter=d from_commit_hash...to_commit_hash
git diff --name-only --diff-filter=d \
$(git merge-base from_commit_hash to_commit_hash) to_commit_hash
git diff --name-only --diff-filter=d ^commit1 commit2
您可以通过查看文件名以及使用--name-status
查看它们的更改状态,来确认此事是否属实:
git diff --name-status from_commit_hash
git diff --name-status from_commit_hash to_commit_hash
git diff --name-status from_commit_hash..to_commit_hash
请注意,我认为--diff-filter=d
比--diff-filter=AM
更好,因为前者包含除“d”删除的文件之外的所有内容,而后者排除除“A”添加和“M”修改的文件之外的所有内容(包括已删除的文件)。前者因此更具包容性,只排除您真正想要排除的内容,这在我看来更好。
在--diff-filter=
中,大写字母过滤器字母表示包含,而小写字母则表示排除
使用大写字母,如D
、A
或M
等,来包含该类型的文件,而使用相应的小写字母,如d
、a
或m
等,则排除该类型的文件。
因此,以下是正确的:
--diff-filter=AM
--diff-filter=am
从
man git diff
(加粗为我所加):
--diff-filter = [(A|C|D|M|R|T|U|X|B)...[*]]
仅选择被添加(
A
),复制(
C
),删除(
D
),修改(
M
),重命名(
R
),类型更改(即常规文件、符号链接、子模块等)(
T
),未合并(
U
),未知(
X
)或已中断配对关系(
B
)的文件。可使用过滤器字符的任意组合(包括无)。如果在比较中有与其他标准匹配的任何文件,则会选择所有路径,如果没有文件与其他标准匹配,则不会选择任何路径。当添加*(全部或无)到组合中时,如果有任何文件与其他标准相匹配,则选择所有路径;如果没有文件与其他标准匹配,则不选择任何路径。这里的大写字母也可以转换为小写字母以排除。例如,
--diff-filter=ad
排除添加和删除的路径。请注意,并非所有差异都可以包含所有类型。例如,如果禁用这些类型的检测,复制和重命名条目就不会出现。
参考资料:
1. 请看
此处或使用
man git diff
查看
git diff --diff-filter=
的文档。
2. 参见此特定答案:
如何获取在两个 Git 提交之间更改的所有文件的列表?