git diff branch1 branch2 文件名对比的是两分支对应提交中该文件的快照,完全不涉及当前工作区修改;若本地已改但未暂存,则差异不可见,输出可能为空。

git diff branch1 branch2 文件名 会忽略工作区修改
直接运行 git diff branch1 branch2 文件名 对比的是两个分支对应提交中该文件的快照,**完全不涉及你当前工作区的改动**。哪怕你本地改了这个文件,只要没 git add,它就看不见。
常见错误现象:执行后输出为空,但你知道文件确实有差异——大概率是你改了但没暂存,或者改的是另一个分支上的版本。
- 确认目标文件在两个分支上都存在,否则报错
fatal: Path 'xxx' does not exist in 'branch1' - 路径必须写全(含子目录),比如
src/main/java/com/example/Service.java,不能只写Service.java - 如果文件是二进制(如图片、jar),
git diff默认只显示 “Binary files a/... and b/... differ”,加--text强制按文本处理可能失败
对比时想包含未暂存的本地修改怎么办
用 git diff branch1..branch2 -- 文件名 语法等价于上面,但更明确;若要纳入当前工作区变更,得换方式:
-
git diff branch1 -- 文件名:对比branch1和你当前工作区该文件(含未暂存修改) -
git diff branch1 --cached -- 文件名:对比branch1和暂存区该文件(即已git add但未 commit 的内容) - 想看“branch1 → 当前暂存区 → 工作区”三层状态?用 IDE(如 IDEA)的三栏对比视图更直观,命令行本身不原生支持这种叠加
diff 输出里出现
如果 git diff 输出里看到冲突标记(如 ),说明这个文件当前处于合并冲突状态,**不是干净的分支对比结果**。
此时 git diff 实际对比的是工作区和暂存区的冲突文件,而非两个分支的原始快照。必须先解决冲突(手动编辑或用 git checkout --ours / --theirs)并 git add 后,才能得到真实分支差异。
- 检查状态:
git status若显示 “both modified”,就说明还在冲突中 - 别用
git diff判断分支是否真有差异,优先用git diff branch1 branch2 --name-only先看哪些文件不同
Windows 路径空格或中文名导致命令失败
路径含空格、括号、中文时,shell 可能解析出错,git diff 报 “No such file or directory”。
- 最稳写法:用双引号包裹路径,例如
git diff main develop -- "src/utils/工具类.java" - 避免用反斜杠
\,一律用正斜杠/,Git 内部统一处理 - 如果仍失败,先
git ls-tree branch1 -- 文件名确认该路径在分支中是否存在且拼写完全一致(大小写敏感!)
实际差异往往藏在细节里:分支名写错、路径大小写不一致、文件被重命名未追踪、甚至 Git 暂存区状态混乱——这些比命令本身更容易导致“明明该有差异却看不到”。











