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 重命名。


参考资料

本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台