1. 简介

git log 用于查看提交历史。它显示提交哈希、作者、日期和提交信息,是了解项目演进历史的核心命令。

典型场景:

  • 查看项目的提交记录
  • 搜索特定提交
  • 查看某个文件的修改历史
  • 统计代码贡献

如果记录过多,则按 Page Up、Page Down、↓、↑ 键来控制显示,按 q 退出历史记录列表。

2. 格式

git log [<options>] [<revision-range>] [[--] <path>…​]

注意,<path> 用于限定指定路径(文件或目录)相关文件的提交历史,不指定缺省为当前目录(及所有子目录)下的所有文件。

3. 选项

3.1 输出格式

--merges
	只展示 merge 信息
	
--no-merges
	不展示 merge 信息
	
--abbrev-commit
	精简 commit id,只展示 40 个十六进制数字构成的 commit id 的首部(默认7位)

--graph
	以文本字符绘制的“图形”展示

--pretty[=<format>]
	自定义输出格式(如 `%h - %s (%an)`)。如果没有参数,则缺省为 oneline

--format=<format>
	以指定格式展示,<format> 可取值 oneline, short, medium, full, fuller, email, raw, format:<string> 和 tformat:<string>,其中<string>为格式控制字符串。缺省值为 medium。常用的是 oneline

--oneline
	一行显示(简洁模式)。等价于 --pretty=oneline --abbrev-commit

--grep=<pattern>
	根据提交消息的内容来过滤和查找提交历史。

--stat[=<width>[,<name-width>[,<count>]]]
  显示文件变更统计(增删行数)

-p, --patch
  显示每次提交的具体变更内容

--relative-date
  显示相对时间(如 `2 days ago`)。等价于 --date=relative

3.2 数量限制

-, -n, --max-count=<number>
  限制显示最近的 n 条提交(如 `-5`--since=<date>, --after=<date>
  显示指定日期之后的提交

--until=<date>, --before=<date>
  显示指定日期之前的提交

--author=<pattern>, --committer=<pattern>
  只显示指定提交者的提交

--grep=<pattern>
  只显示提交信息匹配的提交

3.3 范围与路径

-- <path>
  只显示指定文件或目录的提交历史

<commit1>..<commit2>
  显示两个提交之间的提交(不包含 commit1)

<branch1>..<branch2>
  显示在 branch2 但不在 branch1 中的提交

--all
	显示所有引用(所有分支、远程跟踪分支、标签)的提交历史。

4. 示例

4.1 基本用法

# 完整提交历史
git log

# 一行显示(最常用)
git log --oneline

# 图形化显示分支结构
git log --graph --oneline

4.2 限制数量

# 最近 5 条提交
git log -5 --oneline

# 最近 2 周的提交
git log --since="2 weeks ago"

# 指定日期范围
git log --after="2024-01-01" --before="2024-03-01"

4.3 按作者/信息筛选

# 查看张三的提交
git log --author="张三"

# 搜索提交信息中包含 "bug" 的提交
git log --grep="bug"

4.4 查看文件历史

# 查看 main.go 的提交历史
git log --oneline main.go

# 查看 main.go 每次提交的具体变更
git log -p main.go

4.5 查看分支差异

# 在 feature 但不在 main 中的提交
git log main..feature --oneline

4.6 自定义输出格式

# 自定义格式:哈希 - 信息 (作者)
git log --pretty=format:"%h - %s (%an)"

# 常用格式化占位符
# %h : 短哈希
# %s : 提交信息
# %an : 作者名
# %ae : 作者邮箱
# %ad : 作者日期

5. 注意

5.1 常用别名

# 常用别名配置
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.hist "log --pretty=format:'%C(yellow)%h %C(blue)%ad %C(white)%s %C(red)%d' --date=short"

# 使用别名
git lg
git hist

5.2 git log vs git reflog

命令 内容 说明
git log 提交历史 仓库的提交记录(可被同步)
git reflog 引用日志 本地 HEAD 的移动记录(不可同步)

git reflog 常用于找回丢失的提交。

5.3 查看代码统计

# 查看每次提交的增删行数
git log --stat

# 统计每个人的代码贡献
git shortlog -sn

5.4 完整占位符列表

占位符 含义 示例
%H 完整提交哈希 a1b2c3d4e5f6...
%h 短提交哈希 a1b2c3d
%T 完整树哈希 t1b2c3d...
%t 短树哈希 t1b2c3d
%P 完整父提交哈希 p1b2c3d...
%p 短父提交哈希 p1b2c3d
%an 作者名 张三
%ae 作者邮箱 zhangsan@example.com
%ad 作者日期(按 --date 格式) 2024-06-09 10:30:00 +0800
%ar 作者日期(相对格式) 2 days ago
%at 作者日期(Unix 时间戳) 1717900200
%cn 提交者名 李四
%ce 提交者邮箱 lisi@example.com
%cd 提交者日期 2024-06-09 11:00:00 +0800
%cr 提交者日期(相对格式) 1 hour ago
%ct 提交者日期(Unix 时间戳) 1717903800
%s 提交信息标题 修复登录验证 bug
%b 提交信息正文 详细描述
%B 提交信息(标题 + 正文) 完整信息
%d 引用名称(分支、标签) (HEAD -> main, origin/main)
%D 引用名称(不带括号) HEAD -> main, origin/main
%e 编码方式 UTF-8
%N 提交注释 (通常为空)
%GG GPG 签名原始信息
%G? GPG 签名状态 G(好)、B(坏)、U(未知)等
%GS GPG 签名者 张三 <zhangsan@example.com>
%GK GPG 密钥 ID A1B2C3D4

6. 小结

需求 命令 说明
简洁历史 git log --oneline 最常用,一行一个提交
图形化分支 git log --graph --oneline --all 查看分支结构
最近 N 条 git log -5 --oneline 限制数量
文件历史 git log --oneline main.go 查看文件修改记录
搜索提交信息 git log --grep="bug" 查找特定提交
查看作者提交 git log --author="张三" 按作者筛选
查看分支差异 git log main..feature 分支间差异

一句话总结git log 是查看提交历史的核心命令。--oneline 最常用;--graph 可视化分支;--author--grep 可按条件筛选。推荐配置别名 git lg 简化日常使用。


参考文献

Git - git-log Documentation

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐