查看历史记录 - 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 的强大功能!🚀

这篇教程有帮助吗?