Git】从入门到精通(八)—— git log:查看提交历史

前言

每次 git commit 都会在版本库里留下一条记录,这些记录串成一条历史长河。git log 就是浏览这条长河的"时光机"------它能让你看到每一次提交的详细信息,追溯任何一个文件、任何一行代码的来龙去脉。

本篇将系统讲解 git log 的各种用法:从基本查看到高级过滤、格式化、排序,以及相关的 git show 和 git reflog。


一、git log 的作用

git log 用于查看提交历史记录,主要用途:

  1. 查看项目的所有提交记录
  2. 查看某次提交的作者、时间、信息
  3. 查看某个文件的修改历史
  4. 查看某段代码是哪次提交引入的
  5. 查看分支的合并情况
  6. 按条件过滤历史(作者、日期、关键字等)

二、基本用法

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 看不到某些提交?

可能原因:

  1. 那些提交在别的分支,加 --all 查看
  2. 那些提交被reset/rebase丢弃了,用 git reflog 找
  3. 那些提交被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 声明:本文为原创文章,转载请注明出处

相关推荐
演艺大赏1 小时前
NiFi 从 3 台扩到 25 台:三轮扩容后我才明白,证书必须全量重签、安装包绝对不能拷
大数据
做科研的周师兄1 小时前
【R语言实战】MixSIAR 氢氧同位素水源解析全流程:从混合空间校验到贝叶斯 MCMC 收敛诊断(后附完整代码)
java·大数据·开发语言
isfox3 小时前
MapReduce 数据清洗:脏数据进来,干净数据出去,连 Reduce 都省了
大数据
Francek Chen4 小时前
【大数据处理与分析】数据仓库Hive:09 Hive 编程实践
大数据·数据仓库·hive·hadoop·sql
7177774 小时前
Git自建用什么工具比较好:Gitea、Forgejo、GitLab CE与Gitee的选型对比
git·gitlab·gitea
Percep_gan4 小时前
Linux中安装gitea,很详细
linux·elasticsearch·gitea
其实防守也摸鱼17 小时前
个人学习 Pwn 思路:从基础到漏洞利用的进阶路径
大数据·前端·人工智能·chrome·算法·安全·网络安全
美林数据Tempodata18 小时前
高职大数据技术专业升级的六个落地样本:从产业链需求库到实训室数据链路
大数据·人工智能·数字化转型·产教融合·ai教育
跨境卫士苏苏19 小时前
TikTokShop关联账户认定指引更新跨境代运营团队需要注意哪些管理责任
大数据·人工智能·市场营销·跨境电商·营销策略