git diff 无输出通常因分支未提交变更或本地未同步远程分支;应先 git fetch,再用 git diff origin/main origin/feature 或 git log main..feature 查看差异。

git diff 比较两个分支时,为什么没看到任何输出?
默认情况下 git diff branch1 branch2 是比较两个分支**最新提交的快照差异**,但如果你只改了某个文件却没 git add 或 git commit,它不会出现在 diff 里——它压根不在任一分支的 HEAD 中。
常见错误现象:git diff main feature 返回空白,其实是因为 feature 分支还没提交任何变更,或者你本地没拉取最新远程分支(比如 origin/main 和本地 main 已不同步)。
- 先确保分支都已更新:
git fetch,再用git diff origin/main origin/feature避免本地分支陈旧 - 如果想看「feature 相对于 main 多出了哪些提交」,用
git log main..feature更直接 -
git diff默认不递归比较子模块,如有需要加--submodule
git diff --name-only 和 --stat 的实际用途区别
--name-only 只列文件路径,适合快速确认“动了哪几个文件”;--stat 多一行统计(增删行数),适合粗略评估改动规模。它们都不显示具体代码变化,但能避免刷屏。
使用场景:CI 脚本里判断是否需要跑某类测试,常配合 grep 过滤路径:git diff --name-only main feature | grep "^src/utils/"。
CNB 云原生构建平台的 Git 操作技能,支持代码克隆、提交、推送、分支管理、Merge Request 管理、流水线触发与结果读取。初次使用需收集用户的 Git 用户名和邮箱。
-
--name-only输出无前缀,每行一个路径,结尾无冒号或空格,方便管道处理 -
--stat最后一行是汇总,如3 files changed, 12 insertions(+), 4 deletions(-),注意括号是字面量,不是正则元字符 - 二者都不受
.gitignore影响——被忽略但已跟踪的文件仍会出现在结果中
对比时出现 “fatal: Not a valid object name” 错误
这个错误通常是因为分支名拼错、分支不存在于当前仓库,或你用了远程分支名但没 git fetch 过。
例如输入 git diff origin/dev origin/main 报错,很可能 origin/dev 根本没被 fetch 下来(远程有 dev 分支,但本地 refs/remotes/origin/dev 不存在)。
- 运行
git ls-remote --heads origin看远程有哪些分支名(原始拼写) - 运行
git branch -r看本地已知的远程跟踪分支,确认名字完全一致(注意大小写、斜杠) - 如果确认分支存在但没同步,执行
git fetch origin dev单独拉取,而不是等下次全量 fetch
diff 结果里中文路径乱码或显示为 \344\270\255\346\226\207?
这是 Git 在终端未正确识别编码导致的,不是 diff 本身的问题。Linux/macOS 终端一般用 UTF-8,但 Git 默认可能按 locale 解析路径名;Windows Git Bash 则容易卡在 GBK/UTF-8 混合环境。
临时解决:加 --no-pager 避免 less 干预编码,或设置 Git 配置让其强制用 UTF-8 处理路径:git config --global core.precomposeUnicode true(macOS 必开),Windows 用户建议设 core.autocrlf=false 并统一用 UTF-8 编辑器。
- 检查当前 locale:
locale,确保LANG和LC_ALL含UTF-8 - Git 2.30+ 对 Windows WSL 支持更好,老版本遇到中文路径建议升级
- 路径乱码不影响 diff 内容比对逻辑,只是显示问题;如果要用脚本解析输出,优先用
--name-only -z(null 分隔)代替换行分隔
main 就等于 origin/main,其实它们可以差好几个 commit。

















