讲解
git log 查看提交历史:默认按时间倒序列出每个提交的完整哈希、作者、日期和提交信息。常用的变体有 git log --oneline(每行一个提交,最常用)、git log --stat(附带每次提交的文件改动统计)、git log -p(附带完整差异)、git log -n 5 或 -5(只看最近 5 条)、git log --graph --oneline --all(用 ASCII 图形画出分支合并结构,理解分支历史的利器)。只看某个文件的历史用 git log -- 文件路径。
git diff 查看「差异」,比较的对象由你指定:不加参数的 git diff 比较工作区和暂存区(就是你改了还没 add 的部分);git diff --staged 比较暂存区和最近一次提交(就是你即将提交的内容);git diff HEAD~1 HEAD 比较两个提交;git diff main feature 比较两个分支。输出格式是统一的 diff 格式:@@ 开头的是位置标记,- 行是删除,+ 行是新增。
查看单个提交的完整内容用 git show(默认看 HEAD,也可以 git show 哈希、git show v1.0.0)。这几个命令配合起来就能回答日常的所有「考古」问题:这个项目最近改了什么(log)、我这次改了什么(diff)、某个提交具体干了什么(show)、这行代码是谁什么时候改的(git blame 文件,逐行显示最后修改它的提交)。
示例
echo "未暂存的修改" >> app.js
git diff
git add app.js
git diff --staged
git commit -qm "feat: 更新 app 到 v2"
git log --oneline
git log --stat -2
git show HEAD --stat
git diff HEAD~2 HEAD --stat
git log --oneline --graph --all
第一次 git diff 显示工作区里那行新增;add 之后它挪进了 git diff --staged 的视野。提交后,历史类命令展示的是包含新提交的完整链条。
常见坑
- diff 看不到新文件:未跟踪的文件不在任何 diff 里,必须先 git add(哪怕是 git add -N 声明意图)才会出现。
- 提交后才发现 diff 是空的:已暂存的改动要用 git diff --staged 看,裸 git diff 只看未暂存部分——两个命令覆盖的范围互补。
- git log 里翻半天:善用 --oneline、-n、--author=、--grep=、--since="1 week ago" 过滤,比肉眼翻页快得多。
- 误读分支比较的方向:git diff A B 显示的是「从 A 到 B 的变化」,交换顺序输出会反过来(增删互换),排查时注意自己站在哪边。
小结
log 看历史(--oneline/--stat/--graph 是三大变体),diff 看差异(裸命令看工作区、--staged 看暂存区),show 看单个提交。下一节学习用 .gitignore 把不想跟踪的文件挡在门外。