前言
每次 git commit 都会在版本库里留下一条记录,这些记录串成一条历史长河。git log 就是浏览这条长河的"时光机"------它能让你看到每一次提交的详细信息,追溯任何一个文件、任何一行代码的来龙去脉。
本篇将系统讲解 git log 的各种用法:从基本查看到高级过滤、格式化、排序,以及相关的 git show 和 git reflog。
一、git log 的作用
git log 用于查看提交历史记录,主要用途:
- 查看项目的所有提交记录
- 查看某次提交的作者、时间、信息
- 查看某个文件的修改历史
- 查看某段代码是哪次提交引入的
- 查看分支的合并情况
- 按条件过滤历史(作者、日期、关键字等)
二、基本用法
2.1 git log 默认输出
git log
输出:
commit 8f3a2d1e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0 (HEAD -> main, origin/main)
Author: 张三 <zhangsan@example.com>
Date: Mon Nov 2 14:30:00 2026 +0800
feat(user): 添加用户列表页面
commit 2b5c8e9a1b3c4d5e6f7a8b9c0d1e2f3a4b5c6d7e
Author: 张三 <zhangsan@example.com>
Date: Mon Nov 2 10:15:00 2026 +0800
fix(auth): 修复登录token过期问题
commit a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
Author: 李四 <lisi@example.com>
Date: Sun Nov 1 09:00:00 2026 +0800
docs: 更新README文档
2.2 输出字段解读
每条提交记录包含:
| 字段 | 说明 |
|---|---|
| commit | 提交的完整hash(40位十六进制) |
| (HEAD -> main, origin/main) | 指针信息,表示当前HEAD、本地分支、远程分支 |
| Author | 作者姓名和邮箱 |
| Date | 提交日期和时间 |
| 空行后 | 提交信息(缩进4个空格) |
按 q 退出浏览(输出多时进入分页器less),空格翻页。
三、常用选项
3.1 -p / --patch:显示每次提交的diff
git log -p
输出:
commit 8f3a2d1e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
Author: 张三 <zhangsan@example.com>
Date: Mon Nov 2 14:30:00 2026 +0800
feat(user): 添加用户列表页面
diff --git a/src/pages/UserList.vue b/src/pages/UserList.vue
new file mode 100644
index 0000000..a1b2c3d
--- /dev/null
+++ b/src/pages/UserList.vue
@@ -0,0 +1,15 @@
+<template>
+ <div class="user-list">
+ ...
+ </div>
+</template>
...
每次提交后都附带具体的代码变更,适合查看详细修改内容。
3.2 --stat:显示文件变更统计
git log --stat
输出:
commit 8f3a2d1e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
Author: 张三 <zhangsan@example.com>
Date: Mon Nov 2 14:30:00 2026 +0800
feat(user): 添加用户列表页面
src/pages/UserList.vue | 15 +++++++++++++++
src/router/index.js | 3 ++-
2 files changed, 16 insertions(+), 1 deletion(-)
--stat 显示每次提交改了哪些文件、增删多少行,比 -p 简洁。
3.3 --oneline:单行简洁模式
git log --oneline
输出:
8f3a2d1 feat(user): 添加用户列表页面
2b5c8e9 fix(auth): 修复登录token过期问题
a1b2c3d docs: 更新README文档
9a1b3c4 feat(api): 添加用户接口
5d6e7f8 chore: 初始化项目
每条一行:简短hash + 提交信息。最常用的快速浏览方式。
3.4 -n / --max-count:限制显示条数
# 只看最近3条
git log -3
# 或
git log --max-count=3
# 配合oneline
git log --oneline -5
输出:
8f3a2d1 feat(user): 添加用户列表页面
2b5c8e9 fix(auth): 修复登录token过期问题
a1b2c3d docs: 更新README文档
3.5 --graph:ASCII图显示分支合并历史
git log --oneline --graph
输出:
* 8f3a2d1 feat(user): 添加用户列表页面
* 2b5c8e9 Merge branch 'feature/auth'
|\
| * a1b2c3d fix(auth): 修复登录token过期问题
| * 9a1b3c4 feat(auth): 添加登录功能
* | 5d6e7f8 docs: 更新README文档
|/
* c4d5e6f chore: 初始化项目
* 表示提交,| 和 \ / 表示分支线。能直观看到分支创建、合并的关系。
3.6 --all:显示所有分支
git log --oneline --graph --all
输出:
* 8f3a2d1 (HEAD -> main) feat(user): 添加用户列表页面
| * e5f6a7b (feature/payment) feat(pay): 添加支付功能
| * d6e7f8a fix(pay): 修复金额计算
|/
* 2b5c8e9 fix(auth): 修复登录token过期问题
* a1b2c3d docs: 更新README文档
不加 --all 只显示当前分支的历史;加了之后显示所有分支(包括未合并的)。
四、格式化输出
4.1 --pretty / --format 自定义格式
# 使用预设格式
git log --pretty=oneline # 等同于 --oneline 但显示完整hash
git log --pretty=short # 简短格式
git log --pretty=full # 完整格式(含committer)
git log --pretty=fuller # 更完整(含author和committer的日期)
4.2 常用格式占位符
| 占位符 | 含义 |
|---|---|
| %H | 完整commit hash |
| %h | 简短commit hash |
| %T | 完整tree hash |
| %t | 简短tree hash |
| %an | 作者姓名(author name) |
| %ae | 作者邮箱 |
| %ad | 作者日期 |
| %ar | 作者日期(相对,如"2 days ago") |
| %cn | 提交者姓名 |
| %s | 提交信息标题(subject) |
| %b | 提交信息body |
| %d | 引用名称(分支、tag等) |
| %n | 换行 |
4.3 实用格式示例
示例1:自定义简洁格式
git log --pretty=format:"%h - %an, %ar : %s"
输出:
8f3a2d1 - 张三, 2 hours ago : feat(user): 添加用户列表页面
2b5c8e9 - 张三, 6 hours ago : fix(auth): 修复登录token过期问题
a1b2c3d - 李四, 1 day ago : docs: 更新README文档
示例2:只看hash和信息
git log --pretty=format:"%H %s"
示例3:带颜色
git log --pretty=format:"%C(yellow)%h%C(reset) %C(green)%ar%C(reset) %s"
示例4:显示分支和tag
git log --pretty=format:"%h %d %s" --graph
输出:
8f3a2d1 (HEAD -> main, origin/main) feat(user): 添加用户列表页面
2b5c8e9 (tag: v1.0) fix(auth): 修复登录token过期问题
示例5:适合生成changelog
git log --pretty=format:"* %s" --since="2024-01-01"
输出:
* feat(user): 添加用户列表页面
* fix(auth): 修复登录token过期问题
* docs: 更新README文档
五、过滤历史
5.1 按作者过滤
git log --author="张三"
git log --author="zhangsan"
# 支持正则
git log --author="张\|李"
5.2 按提交信息过滤
# 搜索提交信息包含"登录"
git log --grep="登录"
# 多个条件(AND)
git log --grep="登录" --grep="修复" --all-match
# 支持正则
git log --grep="feat\|fix"
5.3 按日期过滤
# 2024年1月1日之后
git log --since="2024-01-01"
git log --after="2024-01-01"
# 2024年6月30日之前
git log --until="2024-06-30"
git log --before="2024-06-30"
# 最近2周
git log --since="2 weeks ago"
# 最近3天
git log --since="3 days ago"
# 组合:某段时间内
git log --since="2024-01-01" --until="2024-06-30"
# 相对时间
git log --since="1 month ago"
git log --since="yesterday"
5.4 按文件过滤
# 查看某个文件的历史
git log -- src/app.js
# 查看某个目录的历史
git log -- src/pages/
# 配合--stat看改了什么
git log --stat -- src/app.js
注意 -- 的作用:分隔参数和文件路径,避免歧义。
5.5 按代码内容过滤(pickaxe)
-S 搜索某段代码被增加或删除的提交:
# 哪次提交增加或删除了"loginUser"
git log -S "loginUser"
# 配合-p看具体变更
git log -S "loginUser" -p
-G 用正则匹配:
# 哪次提交涉及匹配 /function\s+\w+Login/ 的代码
git log -G "function\s+\w+Login"
这是排查"某行代码是谁写的、什么时候加的"的利器。
5.6 按行范围过滤
-L 可以追踪某一行(或某几行)的修改历史:
# 追踪 app.js 第10行的历史
git log -L 10,10:src/app.js
# 追踪 app.js 第10-20行的历史
git log -L 10,20:src/app.js
# 追踪某个函数
git log -L :functionName:src/app.js
输出会显示这行代码每次被修改的提交和diff,非常强大。
5.7 组合过滤
# 张三在2024年1月之后关于登录的提交
git log --author="张三" --grep="登录" --since="2024-01-01"
# 只看feature类型的提交,最近10条
git log --grep="^feat" -10 --oneline
六、排序
6.1 默认:按时间倒序
最新的提交在最前面。
6.2 --reverse:正序
# 最老的提交在前
git log --reverse --oneline
6.3 --topo-order:拓扑排序
保证子提交在父提交之前显示,分支不交错:
git log --topo-order --oneline --graph
6.4 --date-order:按日期排序
按提交日期排序,但同一时间戳的提交按拓扑序:
git log --date-order --oneline
6.5 --author-date-order
按作者日期而非提交日期排序:
git log --author-date-order --oneline
七、实用组合命令
7.1 最常用:查看分支图
git log --oneline --graph --all
建议配置别名:
git config --global alias.lg "log --oneline --graph --all"
# 之后用
git lg
7.2 看每次改了哪些文件
git log --stat
7.3 看某文件的完整修改历史
git log -p -- src/app.js
按 q 退出。这是代码审查、追溯bug来源的常用命令。
7.4 按作者和日期组合
git log --author="张三" --since="2024-01-01" --oneline
7.5 查看两个分支的差异
# feature分支有而main没有的提交
git log main..feature --oneline
# main有而feature没有的提交
git log feature..main --oneline
# 两边各自独有的提交
git log main...feature --oneline --left-right
7.6 查看某次合并引入的提交
# 查看merge commit 8f3a2d1 合并了哪些提交
git log 8f3a2d1^1..8f3a2d1^2 --oneline
7.7 统计每个人提交次数
git shortlog -sne
输出:
42 张三 <zhangsan@example.com>
18 李四 <lisi@example.com>
5 王五 <wangwu@example.com>
7.8 生成changelog
# 两个tag之间的变更
git log v1.0..v2.0 --pretty=format:"* %s"
# 最近一次tag到现在的变更
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"* %s"
7.9 查看某段时间内某文件的修改
# 2024年6月对app.js的修改
git log --since="2024-06-01" --until="2024-07-01" -- src/app.js
# 配合--stat看改了多少
git log --since="2024-06-01" --until="2024-07-01" --stat -- src/app.js
7.10 查看合并提交
# 只看合并提交
git log --merges
# 只看非合并提交
git log --no-merges
# 查看合并提交引入了哪些提交
git log --merges --oneline
7.11 查看第一个提交
# 查看整个仓库的第一个提交
git log --reverse --oneline | head -1
# 或用底层命令
git rev-list --max-parents=0 HEAD
八、git show 查看单次提交
git show 用于查看单次提交 的详细信息,是 git log -p 的"单条版"。
# 查看最近一次提交
git show
# 查看指定提交
git show 8f3a2d1
# 简洁模式
git show --oneline 8f3a2d1
# 只看某次提交对某文件的影响
git show 8f3a2d1 -- src/app.js
# 只看统计
git show --stat 8f3a2d1
输出:
commit 8f3a2d1e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0
Author: 张三 <zhangsan@example.com>
Date: Mon Nov 2 14:30:00 2026 +0800
feat(user): 添加用户列表页面
diff --git a/src/pages/UserList.vue b/src/pages/UserList.vue
new file mode 100644
...
git show 还能查看tag、blob等对象:
# 查看tag信息
git show v1.0
# 查看某次提交时某文件的内容
git show 8f3a2d1:src/app.js
九、git reflog(引用日志)
git reflog 记录HEAD和分支指针的所有移动,包括commit、reset、checkout等操作。
git reflog
输出:
8f3a2d1 HEAD@{0}: commit: feat(user): 添加用户列表页面
2b5c8e9 HEAD@{1}: checkout: moving from feature to main
a1b2c3d HEAD@{2}: commit: fix(auth): 修复登录token过期问题
9a1b3c4 HEAD@{3}: reset: moving to HEAD~1
5d6e7f8 HEAD@{4}: commit: feat(api): 添加用户接口
9.1 git log 和 git reflog 的区别
| 对比项 | git log | git reflog |
|---|---|---|
| 显示内容 | 当前分支可达的提交 | HEAD/分支的所有移动记录 |
| 包含reset掉的提交 | 否 | 是 |
| 是否永久 | 是(gc后才清除) | 否(默认90天过期) |
| 用途 | 查看正式历史 | 找回误操作的提交 |
9.2 用reflog找回误删的提交
# 误操作:git reset --hard HEAD~1 丢弃了最近一次提交
# 用reflog找到那个提交
git reflog
# 看到:8f3a2d1 HEAD@{0}: reset: moving to HEAD~1
# 2b5c8e9 HEAD@{1}: commit: feat(user): 添加用户列表页面
# 恢复
git reset --hard 2b5c8e9
# 或
git cherry-pick 2b5c8e9
9.3 查看某分支的reflog
git reflog show feature-branch
十、常见问题 FAQ
Q1:git log 显示太多,如何退出?
按 q 退出分页器。或用 --no-pager 禁用分页:
git --no-pager log --oneline
Q2:git log 只显示一行,没有详细信息?
可能配置了别名或 --pretty。检查:
git config --get alias.log
Q3:如何查看某个文件每一行最后修改的提交?
git blame src/app.js
# 或
git blame -L 10,20 src/app.js # 只看10-20行
Q4:git log 看不到某些提交?
可能原因:
- 那些提交在别的分支,加
--all查看 - 那些提交被reset/rebase丢弃了,用
git reflog找 - 那些提交被GC清除了(reflog过期后)
Q5:如何导出提交历史到文件?
git log --oneline > history.txt
# 或
git --no-pager log --pretty=format:"%h %ad %s" --date=short > changelog.txt
Q6:如何查看空提交?
默认 git log 不显示空提交(--allow-empty创建的):
git log --no-walk --pretty=format:"%h %s" $(git rev-list --all --max-count=100)
Q7:如何搜索某次提交的具体diff内容?
# 搜索diff中包含"TODO"的提交
git log -G "TODO" -p
Q8:如何查看某个文件每一行最后是谁修改的?
用 git blame 命令(也叫 git annotate):
# 查看app.js每行的最后修改信息
git blame src/app.js
输出:
8f3a2d1 (张三 2026-11-02 14:30:00 1) import Vue from 'vue'
2b5c8e9 (李四 2026-11-01 10:15:00 2) import Router from 'vue-router'
a1b2c3d (王五 2026-10-31 09:00:00 3)
a1b2c3d (王五 2026-10-31 09:00:00 4) Vue.use(Router)
每行显示:提交hash、作者、日期、行号、代码内容。
常用选项:
# 只看10-20行
git blame -L 10,20 src/app.js
# 忽略空行
git blame -w src/app.js
# 查看某行的完整修改历史(配合-L)
git log -L 15,15:src/app.js
Q9:git log 和 git show 的区别?
-
git log:显示多条提交历史 -
git show:显示单条提交的详细信息(含diff)git show # 最近一次提交
git show HEAD~3 # 倒数第4次提交
git show 8f3a2d1 # 指定提交
Q10:如何查看远程分支的提交历史?
# 先fetch
git fetch origin
# 查看远程分支历史
git log origin/main --oneline
# 对比本地和远程的差异
git log main..origin/main --oneline # 远程有本地没有的
git log origin/main..main --oneline # 本地有远程没有的
十一、小结
本篇详细讲解了 git log 命令:
| 知识点 | 要点 |
|---|---|
| 基本用法 | git log 显示完整历史 |
| --oneline | 单行简洁模式 |
| --graph --all | 查看所有分支图(最常用) |
| --stat / -p | 显示文件统计 / 显示完整diff |
| --pretty=format | 自定义输出格式 |
| 过滤 | --author/--grep/--since/--until/-S/-L |
| 排序 | --reverse/--topo-order/--date-order |
| git show | 查看单次提交 |
| git reflog | 引用日志,找回误操作的提交 |
11.1 git log 在实际工作中的应用场景
场景一:查看今天的开发进度
git log --since="today" --oneline --author="$(git config user.name)"
场景二:查看某个功能的开发历程
git log --grep="auth" --oneline
场景三:排查某行代码的引入历史
# 用blame找到引入这行的提交
git blame src/app.js -L 15,15
# 然后查看那次提交的详细信息
git show <commit-hash>
场景四:生成版本发布说明
# 上个tag到现在的所有变更
git log $(git describe --tags --abbrev=0)..HEAD --pretty=format:"- %s"
场景五:统计团队贡献
git shortlog -sne --since="2024-01-01"
11.2 浏览技巧
git log 输出多时会进入less分页器,常用快捷键:
空格/f:向下翻页b:向上翻页j/↓:向下一行k/↑:向上一行/关键字:搜索n:下一个搜索结果N:上一个搜索结果g:跳到开头G:跳到结尾q:退出
核心记忆:
git log --oneline # 简洁历史
git log --oneline --graph --all # 分支图(最常用)
git log -p -- <file> # 某文件完整历史
git log --author="name" --since="date" # 按条件过滤
git show <commit> # 查看单次提交
git reflog # 引用日志,救命用
实用别名推荐:
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.ll "log --pretty=format:'%C(yellow)%h%C(reset) %C(green)%ar%C(reset) %s'"
git config --global alias.ls "log --stat"
下一篇我们将学习 git diff------如何查看文件之间的差异,这是代码审查和调试的利器。
作者:全栈陈序员 出处:CSDN 声明:本文为原创文章,转载请注明出处