git diff branch1 branch2 显示两分支最新提交快照间的文件级差异,含增删改行及上下文,但不体现branch2独有新增文件;git log master..dev 则列出dev独有的提交,二者职责不同,不可混用。

直接看两个分支代码差在哪,用 git diff branch1 branch2 最快;想确认“dev 比 master 多提交了哪些 commit”,得换 git log master..dev —— 这俩命令目的不同,混用会漏关键信息。
git diff branch1 branch2 显示文件级变更细节
这是最常用的代码比对方式,Git 会以 tree 对象为基准,逐行对比两个分支最新 commit 的工作目录快照。
-
git diff branch1 branch2输出完整差异(含 +\- 行、函数上下文),适合 Code Review 前快速扫一遍改了啥 -
git diff branch1 branch2 --stat只列文件名和增删行数,一眼看出“动了几个文件、改得多不多”,适合同步前快速评估影响范围 -
git diff branch1 branch2 path/to/file.js锁定单个文件,避免被大量无关改动干扰,尤其适合排查某次重构是否误改了旧逻辑 - 注意:如果某个文件在 branch1 中存在、branch2 中已删除,
git diff仍能显示“该文件被删”,但不会标出 branch2 里新增的、branch1 里没有的文件——那是git log的职责
git log master..dev 查 dev 比 master 多了哪些提交
git log 看的是提交历史拓扑,不是文件内容。两个点 .. 是关键,它定义的是“从左边出发、不经过右边的路径所能到达的所有 commit”。
-
git log master..dev列出 dev 有、master 没有的 commit(即 dev 分支独有的新功能/修复) -
git log dev..master反过来,列出仅存在于 master 的提交(比如线上 hotfix 直接合入了 master) -
git log master...dev(三个点)显示两者 diverge 后各自独有的提交,适合合并前确认“两边都改了啥”,但输出顺序容易让人误读,建议加--oneline --graph辅助理解 - 如果某次 PR 合并用了 squash,
git log master..dev可能只显示一个 commit,但git diff仍会暴露出实际修改的全部文件——历史精简了,代码没少改
跨仓库对比分支要用 remote + fetch
当两个分支不在同一个本地 repo(比如 A 仓库的 support/v1 和 B 仓库的 main),不能直接 git diff,因为 Git 默认只认当前 repo 的 ref。
- 先在 A 仓库里添加 B 为 remote:
git remote add repoB /path/to/B.git(或 URL) - 拉取 B 的所有分支:
git fetch repoB,此时repoB/main就变成本地可访问的 ref - 再执行:
git diff origin/support/v1 repoB/main,就能像同 repo 一样对比 - 别用
git diff直接比两个本地文件夹——Git 不认那种“差异”,而且丢掉了 commit 元数据(作者、时间、message),后续无法追溯
容易忽略的边界情况
真正上线前卡住的,往往不是命令写错,而是没意识到这些隐含条件:
- 分支名拼错或未 fetch 到最新:运行
git branch -r确认远程分支是否存在,git show branch1看对应 commit hash 是否符合预期 - 对比的是“最后一次 commit 的快照”,不是当前工作区。如果 branch1 当前有未提交改动,
git diff branch1 branch2不会包含那些改动 -
git diff默认忽略空格和换行差异,如需严格比对,加-w(忽略空白)或--ignore-space-change要谨慎,可能掩盖真实问题 - 子模块变更不会自动展开:若差异涉及 submodule,
git diff只显示 commit hash 变更,得进子模块目录单独git diff











