切分支前需确保工作区干净,否则可能引发冲突;推荐用git switch而非git checkout;对比分支差异应优先使用三点语法git diff a...b;git log -p比git diff更利于理解提交演进。

git checkout 或 git switch 切分支时容易忽略的当前状态
直接 git checkout <branch></branch> 或 git switch <branch></branch> 前,先确认当前工作区是否干净。如果存在未提交的修改,切换分支可能失败或触发自动合并(尤其当文件在目标分支也有改动时),导致意料外的冲突或覆盖。
- 执行
git status查看是否有modified、untracked文件 - 若需保留修改但暂不提交,用
git stash暂存;切完再git stash pop -
git switch是 Git 2.23+ 推荐的专用分支切换命令,比git checkout语义更清晰,不会误触发文件检出操作
git diff 对比两个分支最常用的三种场景
差异对比不是只有一种写法,不同参数组合对应不同需求:谁和谁比、比什么内容(提交历史?工作区?暂存区?)、要不要忽略空格?
- 比两个分支的「最新提交」差异:
git diff branch-a..branch-b(注意双点) - 比「共同祖先到各自最新提交」的汇总差异(更常用):
git diff branch-a...branch-b(三点,即git diff $(git merge-base branch-a branch-b)..branch-b) - 想看某次切换后具体改了哪些行?先
git switch feature-x,再git diff main(默认比较工作区与main分支的 HEAD) - 加
--stat只看改动文件列表和行数:git diff --stat main...dev
git log -p 看分支间提交级差异更直观
git diff 给的是「净变化」,而 git log -p 能按提交粒度展示每个 commit 修改了什么,适合理解功能演进逻辑,尤其当分支有多个提交时。
-
git log -p main..feature-login:列出feature-login有但main没有的所有提交及其补丁 - 加
--oneline --graph辅助定位:git log --oneline --graph main...feature-login - 如果日志太多,加
-n 5限制条数;想排除合并提交,加--no-merges - 注意:log 默认不显示已 merge 进当前分支但尚未 push 的本地提交,确保
git fetch同步远程引用后再比
diff 结果里看到乱码或二进制文件提示?检查 core.autocrlf 和 diff 配置
Windows 用户常遇到 fatal: CRLF would be replaced by LF 或 Binary files a/file.pdf and b/file.pdf differ 却看不到实际内容——这不是 Git 不支持,而是配置或文件类型导致的显示限制。
- 文本换行问题:运行
git config --global core.autocrlf true(Windows)或false(macOS/Linux),避免因 CRLF/LF 自动转换干扰 diff - 想让 Git 尝试对常见二进制格式(如 PDF、DOCX)做文本化 diff,可配置
git config --global diff.exif.textconv exiftool(需系统已安装exiftool) - 临时跳过二进制检测:加
--text参数强制当文本处理(慎用,可能输出乱码):git diff --text main...dev
git switch + git diff ... 组合,但很多人卡在没意识到三点语法(...)才是对比「分支分叉后各自演进」的正确姿势。另外,别忘了 diff 默认不递归比较子模块,需要显式加 --submodule 才能看到嵌套仓库的变化。











