Appearance
查看历史
git log 是查看提交历史的核心命令,提供了丰富的过滤和格式化选项。
git log 基本用法
bash
git log
# 输出:
# commit a1b2c3d4e5f6... (HEAD -> main, origin/main)
# Author: Zhang San <zhang@example.com>
# Date: Mon Mar 9 10:30:00 2026 +0800
#
# feat: 添加用户登录功能
#
# commit e4f5g6h7...
# Author: Li Si <lisi@example.com>
# Date: Sun Mar 8 15:20:00 2026 +0800
#
# fix: 修复样式问题常用显示格式参数
--oneline 单行显示
bash
git log --oneline
# 输出:
# a1b2c3d feat: 添加用户登录功能
# e4f5g6h fix: 修复样式问题
# i7j8k9l chore: 更新依赖--graph 显示分支图
bash
git log --oneline --graph
# 输出:
# * a1b2c3d (HEAD -> main) feat: 合并功能分支
# |\
# | * b2c3d4e (feature/login) feat: 添加登录页面
# | * c3d4e5f feat: 实现认证逻辑
# |/
# * d4e5f6g fix: 修复首页问题--all 显示所有分支
bash
# 显示所有分支(包括远程追踪分支)的提交
git log --oneline --graph --all
# 显示指定分支
git log --oneline feature/login--decorate 显示引用名
bash
# 在提交旁显示分支名、标签名等
git log --oneline --decorate
# a1b2c3d (HEAD -> main, origin/main, tag: v1.0.0) feat: 发布 v1.0.0综合推荐配置
bash
# 完整的美观日志
git log --oneline --graph --all --decorate
# 或者配置别名(推荐)
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git lg按时间过滤
bash
# 某个日期之后的提交
git log --since="2026-01-01"
git log --after="2026-01-01"
# 某个日期之前的提交
git log --until="2026-03-01"
git log --before="2026-03-01"
# 时间范围
git log --since="2026-01-01" --until="2026-03-01"
# 相对时间
git log --since="2 weeks ago"
git log --since="1 month ago"
git log --since="yesterday"按作者过滤
bash
# 按作者名(支持正则)
git log --author="Zhang San"
git log --author="zhang" # 模糊匹配
# 按邮箱
git log --author="zhang@example.com"
# 多个作者(使用 OR)
git log --author="Zhang\|Li"
# 排除某作者(使用 --invert-grep)
git log --author="bot" --invert-grep按提交信息搜索
bash
# 在提交信息中搜索关键词(标题和正文)
git log --grep="登录"
git log --grep="fix"
# 区分大小写(默认不区分)
git log --grep="Login" -i # 不区分大小写(默认)
git log --grep="Login" --no-grep-ignore-case # 区分大小写
# 多个关键词(AND)
git log --grep="feat" --grep="auth" --all-match
# 多个关键词(OR)
git log --grep="feat" --grep="fix" # 默认 OR-S 按代码内容搜索(pickaxe)
-S 参数搜索引入或删除某字符串的提交(称为"pickaxe"搜索):
bash
# 查找添加或删除了 "getUserById" 的提交
git log -S "getUserById"
# 使用正则
git log -G "function getUserById" # -G 支持正则
# 结合文件路径
git log -S "secret_key" -- config/这是追踪某段代码"何时被引入"或"何时被删除"的利器。
-p 查看每次提交的 diff
bash
# 显示每次提交的详细差异
git log -p
# 限制显示最近 3 次提交的 diff
git log -p -3
# 只显示某个文件的提交及其 diff
git log -p -- src/auth.js限制显示数量
bash
# 只显示最近 5 次提交
git log -5
git log -n 5
# 显示最近 1 次提交(常用于查看最新提交)
git log -1git shortlog 提交统计
bash
# 按作者汇总提交数量
git shortlog
# 按提交数量从多到少排序
git shortlog -n
# 只显示提交数,不显示详情
git shortlog -s
# 组合使用
git shortlog -sn
# 输出:
# 42 Zhang San
# 28 Li Si
# 15 Wang Wu
# 统计某个时间段内的贡献
git shortlog -sn --since="2026-01-01"git log --follow 追踪重命名文件
普通的 git log 在文件重命名后会中断追踪。--follow 可以跨重命名追踪:
bash
# 即使文件被重命名,也能看到完整历史
git log --follow src/user-service.js
# 对应的 diff 追踪
git log --follow -p src/user-service.js查看特定范围的提交
bash
# 查看 A 到 B 之间的提交(不含 A,含 B)
git log A..B
# 查看在 feature 分支上,不在 main 分支上的提交
git log main..feature
# 查看两个分支各自独有的提交(三点语法)
git log main...feature
# 查看某标签之后的提交
git log v1.0.0..HEAD
# 查看某文件的修改历史
git log -- path/to/file.js格式化输出
bash
# 自定义格式
git log --pretty=format:"%h - %an, %ar : %s"
# 常用格式占位符:
# %H 完整 SHA-1
# %h 缩短 SHA-1
# %an 作者名
# %ae 作者邮箱
# %ar 作者相对时间(如 "2 hours ago")
# %ad 作者绝对时间
# %s 提交标题
# %b 提交正文
# %d 引用名(分支、标签)
# 输出 JSON 格式(用于脚本处理)
git log --pretty=format:'{"hash":"%h","author":"%an","date":"%ar","message":"%s"}'统计改动文件数
bash
# 显示每次提交改动了哪些文件及行数
git log --stat
# 简化版统计
git log --shortstat实用场景组合
bash
# 查看某人本周的提交
git log --author="Zhang San" --since="1 week ago" --oneline
# 查看某文件的修改历史(单行格式)
git log --oneline --follow -- README.md
# 搜索引入某 bug 的提交
git log -S "offending_code" --since="3 months ago"
# 查看分支合并历史
git log --oneline --merges
# 只查看非合并提交
git log --oneline --no-merges
# 查看两个版本之间有哪些提交(发版对比)
git log --oneline v1.0.0..v1.1.0总结
| 参数 | 用途 |
|---|---|
--oneline | 每行一条提交 |
--graph | 显示分支合并图 |
--all | 显示所有分支 |
--since/--until | 时间范围过滤 |
--author | 按作者过滤 |
--grep | 按提交信息搜索 |
-S | 按代码内容搜索 |
-p | 显示 diff |
--stat | 显示文件统计 |
--follow | 追踪重命名文件 |
熟练使用 git log 的各种参数,能让你快速定位任何历史提交,是代码考古和问题排查的必备技能。