git show 默认只显示提交元信息和变更文件状态,不显示 diff 内容;需加 -p 参数才能查看具体代码改动。

git show 默认只显示变更文件列表,不显示具体内容
执行 git show <commit-id> 时,默认输出是提交元信息 + 变更文件的增删改状态(比如 A file.txt、M src/main.go),但不会展开 diff 内容。很多人误以为“没变化”,其实是默认没展开 —— 这不是 bug,是 Git 的精简设计。
常见错误现象:git show abc123 输出很短,只看到几行文件名,以为漏了内容;其实它默认只做「概览」。
- 加
-s参数可跳过 diff,只看提交信息(适合快速确认作者/时间) - 加
--name-only只列出被修改的文件路径,不含状态符号 - 加
--name-status显示操作类型(A/M/D/R),对 CI 脚本识别变更类型很实用
想看具体改了哪几行?必须显式启用 diff
git show 默认不抑制 diff,但某些终端或别名配置可能意外加了 --no-patch 或 alias 里带 -s,导致看不到代码变动。最稳妥的方式是明确带上 -p(即 --patch)。
使用场景:Code Review 前快速确认某次提交动了哪些逻辑;排查 bug 时回溯某次“看似无关”的提交是否悄悄改了工具函数。
-
git show -p abc123→ 显示完整 diff(含上下文) -
git show -p --stat abc123→ 先给统计摘要(增删行数),再跟 diff -
git show -p -- src/utils.js→ 只看某个文件的改动,避免刷屏
git show 查不到文件?可能是提交本身没包含变更
如果 git show abc123 --name-only 返回空,不代表命令错了,而是这次提交确实是空提交(git commit --allow-empty),或只是改了 gitattributes/.gitignore 等元信息,没动 tracked 文件。
容易踩的坑:git show 不会显示未跟踪(untracked)文件的新增 —— 它只反映索引(staging)和树对象(tree)的差异。临时文件、日志、.env 等通常不在提交中。
- 用
git cat-file -p abc123^{tree}可直接查看该提交对应的 tree 对象,确认实际有哪些路径 - 如果想查“谁在什么时候把某个文件加进来的”,应该用
git log --oneline --follow -- path/to/file,而不是git show -
git show abc123:src/这种语法能列出目录下所有 blob,但不能替代--name-only的语义
对比多个提交时,git show 不适用,得换命令
git show 本质是“单提交快照查看器”,传两个 commit ID(如 git show a..b)会报错或行为异常 —— 它不处理范围。真要对比两次提交之间的差异文件列表,得用 git diff 系列。
性能影响:对大仓库,git diff --name-only a b 比反复 git show 多次更快,因为底层复用 object graph 遍历结果。
-
git diff --name-only abc123 def456→ 两提交间变更文件列表 -
git diff --name-status origin/main HEAD→ 当前分支相对远程的变更类型 -
git show abc123^! --name-only→ 等价于git show abc123 --name-only,但强调“仅此提交引入的变更”(排除 merge commit 的干扰)
真正麻烦的是 merge commit —— git show 默认只显示它和第一个 parent 的差异,容易漏掉其他分支合入的文件。这时候必须用 git diff 显式指定两个 parent,或者加 --cc 看合并冲突上下文。


















