git diff 默认对比工作区与暂存区;git diff head 对比工作区与最后一次提交;git diff --staged 对比暂存区与最后一次提交。

git diff 怎么对比当前工作区和某个历史提交
直接用 git diff 加提交哈希(或分支名、标签名)就能看到当前未暂存的修改与指定版本的差异。比如想看工作区和上一个提交的区别:git diff HEAD;想看和三天前某次提交的差异,先用 git log --oneline -n 5 找到目标哈希,再执行 git diff a1b2c3d。
注意:这个命令默认只比对工作区(working directory),不包含已 git add 进暂存区的改动。如果要包含暂存区,得加 --staged(或 --cached)参数。
-
git diff HEAD→ 工作区 vs 最近一次提交 -
git diff --staged HEAD→ 暂存区 vs 最近一次提交 -
git diff HEAD~2 HEAD→ 倒数第三次提交 vs 最近一次提交(跳过中间)
git log -p 为什么看不到完整差异,怎么补全
git log -p 确实会显示每次提交的 patch,但默认只展开最近几条,且可能被分页器截断。实际使用中常遇到“只看到一半 diff 就停了”,这不是 bug,是 less 分页行为。
解决方法很简单:按 Space 键翻页,G 跳到底部,q 退出。如果想一次性输出全部内容供搜索或重定向,加 --no-pager 前缀:git --no-pager log -p -n 3。
- 不加
--no-pager时,git log -p受环境变量PAGER控制,默认走less -
-n N严格限制输出条数,避免刷屏;没加的话可能卡住或输出巨量内容 - 如果只想看某次提交的 diff,用
git show <commit></commit>更精准,它等价于git log -p -n 1 <commit></commit>
git diff 的三种比较模式:工作区 / 暂存区 / 提交之间怎么选
Git 的 diff 本质是三棵树的比较:工作目录(WD)、暂存区(Index)、最新提交(HEAD)。选错起点,看到的差异就不是你想要的。
常见误操作是改完文件后直接 git diff,结果发现没反应——其实是因为你已经 git add 过,改动进了暂存区,而默认 git diff 不比暂存区。这时候必须显式指定范围。
-
git diff→ WD vs Index(即“还没add的改动”) -
git diff --staged→ Index vs HEAD(即“已add但没commit的改动”) -
git diff HEAD→ WD vs HEAD(即“所有未 commit 的改动”,含已add和未add)
顺带一提:git diff --word-diff 对文字级变更更友好,适合改文档或注释时用。
对比两个任意历史提交:别漏掉双点和三点语法的区别
用 git diff A..B 和 git diff A...B 看起来差不多,但语义完全不同,容易导致漏看合并引入的变更。
A..B 是标准双点语法,等价于 git diff A B,表示“从 A 到 B 的全部差异”,即 B 相对于 A 的变更集合。而 A...B(三点)是“对称差”,找的是 A 和 B 各自相对于其最近共同祖先(merge base)的变更之并集——这对查看合并提交前后变化特别有用。
- 日常比两个普通提交(线性历史),用
git diff commit1..commit2 - 查某次 merge 提交带来了哪些新东西,用
git diff merge_commit^...merge_commit(^表示父提交) - 如果
git diff A...B输出为空,不代表没差异,可能是 A 和 B 共享同一个祖先且无 divergent change
真正容易被忽略的是:当你在 feature 分支上运行 git diff main...HEAD,它展示的是「main 分支最新提交」和「当前 HEAD」各自相对于它们最近共同祖先的差异——这比单纯 main..HEAD 更贴近“这个分支到底加了啥”的直觉,但需要理解 merge base 的存在。











