git diff 默认对比工作区与暂存区,若文件未add则自动回退至HEAD;未输出常见因已add、被忽略、不在仓库根目录或仅权限变更。

直接用 git diff 就能看到工作区文件和最近一次 commit(即基准版本)的差异,这是最常用、最可靠的方案。
为什么 git diff 默认对比的是 HEAD?
Git 的 git diff 命令在不带参数时,默认行为就是比较「工作区」与「暂存区」的差异;但当文件还没 git add 过,暂存区里没有该文件的快照,Git 会自动回退到用「HEAD 版本」作为基准——也就是你最后一次 git commit 时的内容。
换句话说:git diff 文件名 看到的,就是你本地改了什么、还没提交的部分,和上一个正式版本之间的全部增删改。
系统化设计数字化解决方案,涵盖方案类型识别、政策背景分析、需求分析、建设思路设计、架构设计(业务、功能、数据、技术四维度)、技术选型、具体建设内容、实施规划、风险评估和投资估算的全流程能力。适用于规划类、申报类、可研类、投标类和工作汇报类等多种方案产出场景,覆盖政府数字化转型和企业数字化转型两大核心领域。
- 新增行以
+开头,删除行以-开头,无符号的是上下文 - 如果文件已
git add但没commit,git diff就不再显示它——此时得用git diff --staged -
git diff HEAD 文件名和git diff 文件名效果完全一致,显式写HEAD只是增强可读性,不推荐日常使用
git diff 不生效?常见卡点
执行 git diff 后没输出,不等于“没改”,很可能是以下情况之一:
- 文件已被
git add:此时修改在暂存区,git diff看不到,要改用git diff --staged - 文件被
.gitignore忽略:Git 根本不跟踪它,git diff不会列出,也不会报错 - 你当前不在 Git 仓库根目录:命令只对 Git 跟踪范围内的文件有效,进错目录会导致“no output”或 “fatal: not a git repository”
- 文件权限变更(如 chmod):默认不显示,需加
-p或--no-index才能暴露,但这类变更通常不是代码逻辑关注点
想看某个具体文件的历史修改,而不是只看当前未提交部分?
如果目标是确认「这个文件从上次提交到现在,到底动了哪些地方」,git diff 已足够。但如果你需要追溯更早的改动脉络,比如排查某段逻辑是什么时候引入的,就得换命令:
-
git log -p --oneline 文件名:按提交倒序列出每次修改的完整补丁(-p),每条记录一行摘要(--oneline) -
git blame 文件名:逐行显示每行代码最后是谁、在哪次提交里改的,适合快速定位责任归属 -
git show HEAD:文件名:查看 HEAD 版本中该文件的原始内容,可用于手动比对(注意冒号不能省)
真正容易被忽略的是:很多人以为 git diff 能看到所有修改,结果发现某些改动“消失”了——其实只是它们已经进了暂存区,或者压根没被 Git 跟踪。动手前先跑一遍 git status,比硬猜快得多。

















