查看历史记录 - git log
掌握 git log 命令的各种用法,学习如何查看和分析项目的提交历史
⏱️ 18 分钟📊 入门📅 2024/1/6
历史日志查询
简介
git log 是查看项目历史的主要命令。通过它,你可以看到谁在什么时候做了什么修改。
掌握 git log 的各种用法,能帮助你:
- 📜 追踪代码的演变过程
- 🔍 找到引入 bug 的提交
- 👥 了解团队成员的工作
- ⏰ 查看项目时间线
基本用法
查看完整历史
git log
输出:
commit f3a2b1c9d8e7f6g5h4i3j2k1 (HEAD -> main)
Author: Zhang San <zhangsan@example.com>
Date: Mon Jan 8 14:30:00 2024 +0800
添加用户登录功能
commit e2d1c0b9a8f7g6h5i4j3k2l1
Author: Li Si <lisi@example.com>
Date: Mon Jan 8 10:15:00 2024 +0800
修复首页样式问题
信息解读:
commit ...: 提交的唯一 SHA-1 标识Author: 作者姓名和邮箱Date: 提交日期和时间- 最后是提交信息
退出日志查看
- 按
q键退出 - 或使用
空格翻页 - 使用
方向键滚动
简洁格式
单行显示
git log --oneline
输出:
f3a2b1c 添加用户登录功能
e2d1c0b 修复首页样式问题
d1c0b9a 创建导航栏组件
c0b9a8f 初始化项目
每个提交只显示:
- 简短的提交 ID(前 7 位)
- 提交信息
限制显示数量
# 只显示最近 5 条
git log -5
# 或
git log -n 5
# 结合 oneline
git log --oneline -10
查看详细修改
显示每次提交的差异
git log -p
或:
git log --patch
输出会包含每个文件的具体修改内容(类似 git diff)。
只看某个文件的历史
git log -p README.md
这会显示 README.md 文件的所有修改历史。
显示统计信息
git log --stat
输出:
commit f3a2b1c9...
Author: Zhang San
Date: Mon Jan 8 14:30:00 2024
添加用户登录功能
src/auth.js | 45 +++++++++++++++++++++++++++++++++
src/login.js | 32 ++++++++++++++++++++++++
README.md | 2 +-
3 files changed, 78 insertions(+), 1 deletion(-)
显示每个文件修改了多少行。
格式化输出
自定义格式
git log --pretty=format:"%h - %an, %ar : %s"
输出:
f3a2b1c - Zhang San, 2 hours ago : 添加用户登录功能
e2d1c0b - Li Si, 5 hours ago : 修复首页样式问题
常用占位符:
| 占位符 | 说明 |
|---|---|
%H | 完整的提交哈希 |
%h | 简短的提交哈希 |
%an | 作者名字 |
%ae | 作者邮箱 |
%ad | 作者修改日期 |
%ar | 作者修改日期(相对时间) |
%cn | 提交者名字 |
%s | 提交信息 |
%b | 提交正文 |
更多预定义格式
# 短格式
git log --pretty=short
# 完整格式
git log --pretty=full
# 更完整
git log --pretty=fuller
图形化显示分支
显示分支图
git log --graph
输出:
* commit f3a2b1c
| Author: Zhang San
| Date: Mon Jan 8
|
| 添加用户登录功能
|
* commit e2d1c0b
| Author: Li Si
|
| 修复首页样式问题
结合 oneline
git log --graph --oneline --all
输出:
* f3a2b1c (HEAD -> main) 添加用户登录功能
* e2d1c0b 修复首页样式问题
| * d1c0b9a (feature/new-ui) 更新 UI 设计
|/
* c0b9a8f 初始化项目
这是查看分支历史最直观的方式!
过滤提交
按时间过滤
最近 n 天
# 最近 7 天
git log --since=7.days
# 或
git log --since="1 week ago"
指定日期范围
# 某天之后
git log --since="2024-01-01"
# 某天之前
git log --until="2024-01-31"
# 日期范围
git log --since="2024-01-01" --until="2024-01-31"
相对时间
# 最近 2 小时
git log --since="2 hours ago"
# 最近 3 周
git log --since="3 weeks ago"
# 昨天
git log --since=yesterday
按作者过滤
# 某个作者的提交
git log --author="Zhang San"
# 可以使用正则表达式
git log --author="Zhang\|Li"
按提交信息过滤
# 包含特定关键词
git log --grep="修复"
# 正则表达式
git log --grep="bug.*fix" --regexp-ignore-case
按文件过滤
# 某个文件的历史
git log -- README.md
# 多个文件
git log -- src/ docs/
# 某个目录
git log -- src/components/
按修改内容过滤
# 查找添加或删除了特定字符串的提交
git log -S "function login"
# 或使用正则
git log -G "login.*function"
这对找到引入或删除某段代码的提交很有用!
查看特定提交
查看某个提交的详情
git show f3a2b1c
显示该提交的完整信息和修改内容。
查看某个提交的某个文件
git show f3a2b1c:src/auth.js
比较差异
两个提交之间的差异
git log main..feature
显示 feature 分支有但 main 分支没有的提交。
查看未推送的提交
git log origin/main..main
显示本地有但远程没有的提交(还没推送的)。
实用别名
创建美化的 log 别名
git config --global alias.lg "log --graph --oneline --decorate --all"
现在可以使用:
git lg
更多有用的别名
# 详细日志
git config --global alias.ll "log --graph --pretty=format:'%C(yellow)%h%C(reset) - %C(blue)%an%C(reset), %C(green)%ar%C(reset) : %s'"
# 查看最近 10 条
git config --global alias.l10 "log --oneline -10"
# 查看今天的提交
git config --global alias.today "log --since=midnight --author='$(git config user.name)' --oneline"
实战案例
案例 1: 找到某个功能是谁写的
# 查找包含 "登录" 的提交
git log --grep="登录" --oneline
# 查看详细信息
git show abc123
案例 2: 找到引入 bug 的提交
# 查找修改了 payment.js 的提交
git log --oneline -- src/payment.js
# 查看具体修改
git log -p -- src/payment.js
案例 3: 查看某人本周的工作
git log --author="Zhang San" --since="1 week ago" --oneline
案例 4: 准备周报
git log --author="$(git config user.name)" \
--since="1 week ago" \
--pretty=format:"%ad - %s" \
--date=short
输出:
2024-01-08 - 添加用户登录功能
2024-01-07 - 修复支付页面 bug
2024-01-06 - 优化数据库查询
案例 5: 查看文件重命名历史
git log --follow --oneline -- newname.js
--follow 参数会追踪文件重命名前的历史。
高级技巧
查看合并提交
# 只看合并提交
git log --merges
# 不看合并提交
git log --no-merges
查看分支之间的差异
# A 分支独有的提交
git log main..feature
# B 分支独有的提交
git log feature..main
# 两个分支的所有差异
git log main...feature
查看谁修改了某一行
git blame README.md
输出:
a1b2c3d (Zhang San 2024-01-01 10:00:00 +0800 1) # Project Title
b2c3d4e (Li Si 2024-01-02 11:00:00 +0800 2)
c3d4e5f (Wang Wu 2024-01-03 12:00:00 +0800 3) This is a demo project.
统计代码贡献
# 每个作者的提交次数
git shortlog -s -n
# 每个作者的代码行数
git log --author="Zhang San" --pretty=tformat: --numstat \
| awk '{ add += $1; subs += $2; loc += $1 - $2 } END \
{ printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }'
性能优化
大仓库优化
# 浅克隆(只要最近的历史)
git log --since="3 months ago"
# 只看文件名,不看内容
git log --name-only
# 只看状态(新增/修改/删除)
git log --name-status
常见问题
Q1: 如何找回"丢失"的提交?
# 查看所有操作历史(包括已删除的)
git reflog
# 恢复提交
git reset --hard abc123
Q2: 历史太长,如何快速查找?
# 使用搜索(按 /)
git log
# 然后按 / 输入关键词
# 或直接用 grep
git log --oneline | grep "关键词"
Q3: 如何只看某个分支的历史?
git log feature-branch
实用命令组合
# 我最喜欢的 log 命令
git log --graph --oneline --decorate --all -20
# 查看本周所有人的工作
git log --since="1 week ago" --oneline --no-merges
# 查看待发布的内容
git log origin/main..HEAD --oneline
# 美化输出
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset'
小结
git log 的核心命令:
git log- 查看历史git log --oneline- 简洁显示git log --graph- 图形化显示git log -p- 查看修改内容git log --since/--until- 时间过滤git log --author- 作者过滤git log --grep- 消息过滤git log -- 文件- 文件历史
记住:git log 只是查看历史,不会修改任何内容,放心使用!
下一步
继续探索 Git 的强大功能!🚀