git show 默认只显示提交信息和文件变更摘要,不展开代码差异;加 -p 才显示具体增删内容,--name-only 仅列文件路径,-m 用于查看合并提交的父提交差异。

git show 默认只显示变更文件列表,不展开内容
直接运行 git show <commit-id></commit-id> 会输出提交信息、作者、时间,然后是「差异摘要」——也就是哪些文件被修改/新增/删除,但默认不显示具体改了哪几行。很多人误以为没生效,其实是它压根没打算给你展开 diff 内容,除非你明确要。
常见错误现象:git show abc123 输出里只有 modified: src/main.js 这种一行,找不到任何代码变动,以为命令失效。
- 加
-p(或--patch)才真正显示每处代码增删,这是最常用组合 - 加
--name-only只列出文件路径,适合脚本提取或快速扫一眼范围 - 加
--stat显示每文件变更行数统计,比纯列表更直观 - 如果提交是合并(merge),
git show默认只显示合并提交本身(空 diff),得加-m才分别对比每个父提交
git show 后接不同参数,行为差异极大
同一个 git show 命令,参数一换,输出逻辑就变:不是“多显示一点”,而是“切换模式”。比如 --name-only 和 -p 互斥——前者禁用 diff,后者强制展开,不能同时生效。
使用场景举例:CI 脚本里想检查某次 PR 提交是否碰了配置文件,用 git show --name-only HEAD | grep -q 'config.yaml' 最轻量;而 Code Review 时必须看上下文,就得 git show -p HEAD~1。
-
--name-only:输出形如package.jsonsrc/utils.ts,无冒号无状态,适合管道处理 -
--name-status:输出形如M src/index.tsA README.md,M/A/D/R/C 标明操作类型 -
-p:默认显示函数级上下文(hunk header),加--no-prefix可去掉 a/b 前缀,方便 patch 应用 - 注意
git show HEAD:src/index.ts是另一种用法——它查的是该提交下文件的*快照内容*,不是 diff,别和变更查看混淆
用 git show 查合并提交容易漏掉真实改动
合并提交(merge commit)在 git log 里看起来像一次提交,但实际是两个分支的交汇点。直接 git show <merge-commit></merge-commit> 默认只显示 merge 自身(通常无 diff),真正的业务代码变更藏在它的两个父提交里。
常见错误现象:执行 git show abc123(abc123 是 merge commit)后一片空白或只有“Merge branch 'dev'”,以为这次合并没改代码。
- 先用
git show --pretty=raw <merge-commit></merge-commit>看父提交哈希,通常有两行parent xxx - 再对每个父提交单独
git show -p <parent-hash></parent-hash>,才能看到各自带来的变更 - 快捷方式:
git show -p <merge-commit>^1</merge-commit>查第一个父(通常是主干),^2查第二个父(通常是特性分支) - 如果合并用了
--squash,那它就不是 merge commit,而是普通提交,不用特殊处理
git show 不会自动过滤 submodule 变更
项目含 submodule 时,git show 默认把 submodule 的 commit hash 变更也当“文件修改”列出来,比如显示 Subproject commit abcd123... → efgh456...。这不算错误,但容易干扰判断——你关心的是源码改了啥,不是子模块升级了几版。
性能影响不大,但兼容性要注意:老版本 Git(--name-status 支持不一致,可能漏标状态。
- 加
--ignore-submodules完全跳过 submodule 行,最干净 - 加
--submodule=log把 submodule 变更转成可读日志(需 Git ≥2.11) - 如果真要审查 submodule 内部改动,得进对应目录再跑
git show,git show本身不递归 - 注意
.gitmodules文件本身的修改仍会正常显示,它只是普通文本文件
git show 不是“一键展开所有”,它是一组开关组合,参数选错,看到的就是另一件事。











