Git 如何只列出两个版本之间改动的文件名
git diff --name-only 提交A 提交B 只列文件名;--stat 看行数摘要;--name-status 看新增/修改/删除类型。发版清单、Code Review 范围圈定必备。
一句话回答:git diff --name-only <版本A> <版本B>——只输出改动的文件名列表,不显示具体内容。加 --name-status 能同时看到每个文件是新增(A)、修改(M)还是删除(D);加 --stat 看每个文件的改动行数摘要。
基本用法
git diff --name-only v1.0.0 v1.1.0 # 两个标签之间
git diff --name-only main develop # 两个分支之间
git diff --name-only HEAD~10 HEAD # 最近 10 个提交
输出就是纯文件名列表,一行一个,方便管道处理。
常用变体
git diff --name-status A B # 带状态:M=修改 A=新增 D=删除
git diff --stat A B # 带增删行数的摘要
git diff --shortstat A B # 只有总计一行
git diff --name-only A B -- src/ # 只看某目录下的变化
实用场景
发版清单/变更评审:
git diff --name-only v1.4.0 v1.5.0 -- '*.sql' '*.yaml'
给脚本处理文件名:
git diff --name-only -z --diff-filter=ACMR A B
-z 以 NUL 分隔,避免空格、换行和引号破坏路径。脚本必须使用支持 NUL 的读取方式。输出是版本间的路径清单,不保证对应工作区存在或内容属于 B;删除文件、重命名、未提交改动均需额外处理。
要交付版本差异,通常导出 git diff --binary A B 补丁更准确;要交付整个 B 快照则用 git archive。不要把 name-only 直接接 xargs tar,当作“B 版本变更包”。
两个点的细节
A B与A..B等价;A...B(三个点)是"分叉点与 B"的差异——评审"这个分支引入了什么"时用三点更准- 合并提交之间的对比注意三点/两点的语义差异,搞错会漏看或多看文件
常见问题(FAQ)
Q:想看未提交的改动文件呢?
A:git diff --name-only(工作区 vs 暂存区)、git diff --name-only --cached(暂存区 vs HEAD)、git status --short(最直观,含未跟踪文件)。
Q:输出的路径基于哪个目录?
A:默认相对仓库根目录。在子目录里执行想拿相对路径加 --relative;管道给其他工具用时一般保持默认(仓库根相对路径,不是绝对路径)更稳。
Q:能按改动类型过滤吗?
A:可以:git diff --name-only --diff-filter=A A B 只看新增文件;--diff-filter=D 只看删除;M 修改、R 重命名。
参考资料
本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。