Git 提交历史

Git 查看提交历史

掌握Git查看提交历史的完整命令指南,包括基本日志查看、筛选、格式化输出和图形化展示

开始学习

基本查看命令

git log 是查看提交历史的主要命令,它提供了多种选项来定制输出。

基本日志

查看完整的提交历史:

git log

默认情况下,git log 会按时间倒序列出提交,显示提交哈希、作者、日期和提交信息。

单行显示

简洁的单行格式:

git log --oneline

每个提交只显示一行,包含缩短的提交哈希和提交信息。

显示更改

查看每次提交的详细更改:

git log -p

-p--patch 选项显示每次提交引入的实际更改(差异)。

统计信息

查看更改统计:

git log --stat

显示每次提交修改的文件列表以及添加/删除的行数统计。

基本日志输出示例

commit a1b2c3d4e5f6g7h8i9j0
Author: 张三 <zhangsan@example.com>
Date: Mon Oct 16 14:30:22 2023 +0800

实现用户登录功能
commit b2c3d4e5f6g7h8i9j0k1
Author: 李四 <lisi@example.com>
Date: Fri Oct 13 10:15:45 2023 +0800

修复首页样式问题
commit c3d4e5f6g7h8i9j0k1l2
Author: 王五 <wangwu@example.com>
Date: Wed Oct 11 09:05:30 2023 +0800

初始化项目结构

格式化输出

Git提供了多种选项来自定义日志输出的格式,使其更符合你的需求。

自定义格式

使用 --pretty 选项:

git log --pretty=format:"%h - %an, %ar : %s"

常用格式占位符:

  • %h - 缩短的提交哈希
  • %an - 作者名字
  • %ar - 相对时间(如"2周前")
  • %s - 提交信息

图形化显示

显示分支和合并历史:

git log --graph --oneline --all

选项说明:

  • --graph - 显示ASCII图形表示分支历史
  • --oneline - 单行显示每个提交
  • --all - 显示所有分支

限制输出数量

限制显示的提交数量:

# 显示最近5个提交
git log -5

# 显示最近3个提交的详细信息
git log -3 -p

使用 -n--max-count=n 限制显示的提交数量。

排序选项

控制提交的排序方式:

# 按作者日期排序
git log --author-date-order

# 按拓扑顺序排序
git log --topo-order

# 按提交日期倒序(默认)
git log --date-order

不同的排序方式可以帮助你更好地理解项目历史。

图形化输出示例

* a1b2c3d (HEAD -> main) 实现搜索功能
* b2c3d4e 更新文档
| * c3d4e5f (feature/login) 实现用户登录
|/
* d4e5f6g 初始化项目

筛选提交历史

Git提供了强大的筛选功能,让你能够找到特定的提交。

按作者筛选

查找特定作者的提交:

# 查找特定作者的提交
git log --author="张三"

# 使用正则表达式匹配作者名
git log --author="张.*"

作者名可以是完整名称、部分名称或使用正则表达式。

按时间筛选

基于时间范围筛选提交:

# 显示2周内的提交
git log --since="2 weeks ago"

# 显示2023年10月的提交
git log --since="2023-10-01" --until="2023-10-31"

# 显示10天前到2天前的提交
git log --since="10 days ago" --until="2 days ago"

按提交信息筛选

查找包含特定关键词的提交:

# 查找提交信息包含"bug"的提交
git log --grep="bug"

# 查找提交信息包含"feature"但不包含"WIP"的提交
git log --grep="feature" --invert-grep --grep="WIP"

--grep 选项搜索提交信息,支持正则表达式。

按文件筛选

查找影响特定文件的提交:

# 查找影响README.md文件的提交
git log -- README.md

# 查找影响src/目录下所有文件的提交
git log -- src/

# 查找影响多个特定文件的提交
git log -- file1.txt file2.js

-- 后面指定文件路径来筛选影响这些文件的提交。

提示: 你可以组合多个筛选条件来精确查找特定的提交。例如:

# 查找张三在过去2周内提交的与登录功能相关的提交
git log --author="张三" --since="2 weeks ago" --grep="登录"

高级用法

Git提供了一些高级选项,用于更深入地分析提交历史。

引用日志

引用日志记录分支和HEAD的移动历史:

# 查看HEAD的引用日志
git reflog

# 查看特定分支的引用日志
git reflog show branch-name

引用日志可以帮助你找回误删的分支或提交。

提交范围

查看两个提交之间的历史:

# 查看commitA和commitB之间的提交
git log commitA..commitB

# 查看在branchA但不在branchB中的提交
git log branchB..branchA

# 查看最近3次提交的详细信息
git log -3 -p

自定义别名

创建常用日志命令的别名:

# 创建图形化日志的别名
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

别名可以大大简化常用命令的输入。

比较提交

比较两个提交之间的差异:

# 比较两个提交
git diff commit1 commit2

# 比较当前工作目录与特定提交
git diff HEAD~3

# 比较两个分支
git diff branch1..branch2

最佳实践: 将常用的复杂日志命令设置为别名,可以大大提高工作效率。例如,你可以创建一个显示图形化历史、作者和相对时间的别名。

实战示例

日常开发场景

查看最近活动
# 查看今天的提交
git log --since="midnight" --oneline

# 查看我今天的提交
git log --since="today" --author="$(git config user.name)" --oneline
代码审查准备
# 查看功能分支与主分支的差异
git log main..feature-branch --oneline --no-merges

# 查看功能分支的详细更改
git log -p main..feature-branch
查找引入bug的提交
# 使用二分查找定位引入bug的提交
git bisect start
git bisect bad # 当前版本有问题
git bisect good commit-hash # 指定一个已知的好版本
# Git会自动进行二分查找,直到找到第一个坏提交

实用命令组合

项目统计
# 查看项目提交数量排名前5的作者
git shortlog -sn --all --no-merges | head -5

# 查看每周提交活动
git log --since="1 year ago" --pretty=format:"%ad" --date=short | sort | uniq -c
发布说明生成
# 生成上次发布以来的功能列表
git log $(git describe --tags --abbrev=0)..HEAD --oneline --no-merges --grep="feat:"

# 生成上次发布以来的修复列表
git log $(git describe --tags --abbrev=0)..HEAD --oneline --no-merges --grep="fix:"
文件历史追溯
# 查看文件的完整修改历史
git log -p --follow -- filename

# 查看谁在什么时候修改了文件的特定行
git blame filename

实用技巧: 使用 git log -S"function_name" 可以查找添加或删除了特定字符串(如函数名)的提交,这在追踪代码变更时非常有用。