git diff --stat 用于快速统计文件级增删行数,输出如“file.py | 12 +-”及汇总行,不解析语义、不展开上下文,适合初筛改动规模,但不反映净增减或逻辑变化。

直接看改动规模,git diff --stat 是最轻量、最可靠的第一步 —— 它不展开具体变更,只告诉你“改了哪些文件、每文件动了多少行”,适合快速评估 PR 或版本升级的影响范围。
git diff --stat 为什么能快速判断改动规模
git diff --stat 输出的是「文件粒度」的增删行数汇总,不含上下文、不解析语义,因此极快且稳定。它本质是统计 git diff 产生的 patch 中 + 和 - 行数量,再按文件聚类。
- 输出格式固定:
path/to/file.py | 12 +-表示该文件共 12 行变动(含插入与删除) - 末尾汇总行如
24 files changed, 156 insertions(+), 89 deletions(-)是全量统计依据 - 对重命名、复制、大块移动默认开启检测(Git 2.9+),不会误判为“删旧+建新”
- 不依赖工作区状态,只要两个分支可 reach,本地无 checkout 也能跑
跨分支对比时 --stat 的常见陷阱
看似简单,但参数顺序和符号用法错一点,结果就完全不对。
-
git diff branchA branchB --stat和git diff branchA..branchB --stat等价,但git diff branchA...branchB --stat(三点)比较的是「两分支分叉点到各自最新提交」的差异,不是 A→B 的单向变更 - 如果目标分支尚未 fetch 到本地,
origin/feature会报错,必须先git fetch -
--stat默认截断长路径(如显示src/…/utils/handle.js),加--stat=200可设宽度,避免漏掉嵌套深的文件 - 二进制文件(如图片、压缩包)会被标为
binary files differ,不计入行数统计 —— 这是正常行为,不是 bug
想看出“净增减”?别信 --stat 汇总行
git diff --stat 末尾的 insertions(+) 和 deletions(-) 是 raw patch 行数,**不是逻辑意义上的“新增功能行”或“删除废弃代码行”**。一次修改(比如改一行函数体),会被记为 1 deletion + 1 insertion,净变化为 0,但 --stat 显示 +1 -1。
- 真正想算“净增行数”,得用
git diff --numstat branchA..branchB,它输出三列:<insertions><deletions><file></file></deletions></insertions>,再自己awk '{ins+=$1; del+=$2} END{print "net:", ins-del}' -
--shortstat更简略,只给汇总,但同样不反映净变化 - 重构类提交(如变量重命名、格式化)会产生大量 +/- 行,但业务逻辑可能零改动 —— 此时看文件列表比看数字更有意义
配合其他命令做有效评估
单靠 --stat 只能回答“有多大”,不能回答“值不值得审”或“风险在哪”。需要组合:
- 先用
git diff --name-only branchA..branchB快速扫一遍改了哪些模块,排除生成文件(dist/、node_modules/) - 对关键文件,加
--word-diff看是否只是文案微调:git diff --word-diff branchA..branchB -- src/i18n/en.json - 怀疑有重命名干扰统计?加
-M参数启用重命名检测:git diff -M --stat branchA..branchB - 要导出供评审用,加
--no-pager避免卡在 less 里:git --no-pager diff --stat branchA..branchB > diff-stat.txt
真正容易被忽略的,是 --stat 统计的“行”根本没区分空行、注释、模板语法 —— 它只认 patch 里的 + 和 -。一个 .vue 文件改了 50 行,可能 45 行是 HTML 标签缩进,实际逻辑改动就 2 行。看数字之前,先扫一眼 --name-only 列表更省时间。











