Skip to content

查看历史

概述

Git 提交历史是项目的"时光机",记录了项目的每一次变更。掌握查看历史的方法,可以帮助你追溯问题、了解项目演进过程、审查代码变更,以及进行团队协作。

Git 提供了强大的 git log 命令来查看和分析提交历史,支持多种输出格式、筛选条件和图形化显示。

git log 基本用法

基本命令

bash
# 查看提交历史
git log

# 输出示例
commit abc1234567890abcdef1234567890abcdef12345678 (HEAD -> main, origin/main)
Author: Zhang San <zhang@example.com>
Date:   Mon Jan 15 10:00:00 2024 +0800

    feat: 添加用户登录功能

commit def5678901234567890abcdef1234567890abcdef
Author: Li Si <li@example.com>
Date:   Sun Jan 14 15:30:00 2024 +0800

    fix: 修复登录验证 bug

commit ghi90123456789012345678901234567890123456
Author: Wang Wu <wang@example.com>
Date:   Sat Jan 13 09:00:00 2024 +0800

    docs: 更新 README 文件

限制显示数量

bash
# 显示最近 n 次提交
git log -n 5
# 或
git log -5

# 显示最近 1 次提交
git log -1

# 显示最近 10 次提交
git log -10

单行显示

bash
# 单行显示提交历史
git log --oneline

# 输出示例
abc1234 feat: 添加用户登录功能
def5678 fix: 修复登录验证 bug
ghi9012 docs: 更新 README 文件
xyz5678 feat: 初始化项目

# 单行显示最近 5 次
git log --oneline -5

显示差异

bash
# 显示每次提交的差异
git log -p

# 显示最近 2 次提交的差异
git log -p -2

# 显示单词级别的差异
git log -p --word-diff

# 显示差异统计
git log --stat

# 输出示例
commit abc1234
Author: Zhang San <zhang@example.com>
Date:   Mon Jan 15 10:00:00 2024 +0800

    feat: 添加用户登录功能

 src/Controllers/AuthController.php | 45 +++++++++++++++++++++++++
 routes/web.php                     |  3 ++
 2 files changed, 48 insertions(+)

格式化输出

预定义格式

bash
# 单行格式
git log --oneline

# 简洁格式
git log --oneline --decorate

# 中等格式
git log --oneline --decorate --graph

# 完整格式
git log --pretty=fuller

# 输出示例
commit abc1234567890abcdef1234567890abcdef12345678
Author:     Zhang San <zhang@example.com>
AuthorDate: Mon Jan 15 10:00:00 2024 +0800
Commit:     Zhang San <zhang@example.com>
CommitDate: Mon Jan 15 10:00:00 2024 +0800

    feat: 添加用户登录功能

自定义格式

bash
# 使用 --pretty=format

# 基本格式
git log --pretty=format:"%h - %an, %ar : %s"

# 输出示例
abc1234 - Zhang San, 2 hours ago : feat: 添加用户登录功能
def5678 - Li Si, 1 day ago : fix: 修复登录验证 bug

# 常用占位符
%H  提交哈希(完整)
%h  提交哈希(简短)
%T  树哈希(完整)
%t  树哈希(简短)
%P  父哈希(完整)
%p  父哈希(简短)
%an 作者名字
%ae 作者邮箱
%ad 作者日期
%ar 作者日期(相对)
%cn 提交者名字
%ce 提交者邮箱
%cd 提交日期
%cr 提交日期(相对)
%s  提交信息(标题)
%b  提交信息(正文)
%B  提交信息(完整)
%d  引用名称(分支、标签)
%f  提交信息(文件名格式)

格式化示例

bash
# 显示哈希、作者、日期、信息
git log --pretty=format:"%h - %an, %ad : %s" --date=short

# 输出
abc1234 - Zhang San, 2024-01-15 : feat: 添加用户登录功能

# 显示完整信息
git log --pretty=format:"%H%n作者: %an <%ae>%n日期: %ad%n信息: %s%n"

# 彩色输出
git log --pretty=format:"%Cred%h%Creset - %Cgreen%an%Creset, %Cblue%ad%Creset : %s" --date=short

# 美化日志(推荐)
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

# 输出示例
* abc1234 - (HEAD -> main, origin/main) feat: 添加用户登录功能 (2 hours ago) <Zhang San>
* def5678 - fix: 修复登录验证 bug (1 day ago) <Li Si>

日期格式

bash
# 不同日期格式
git log --date=short     # 2024-01-15
git log --date=relative  # 2 hours ago
git log date=iso         # 2024-01-15 10:00:00 +0800
git log --date=rfc       # Mon, 15 Jan 2024 10:00:00 +0800
git log --date=unix      # 1705287600
git log --date=format:'%Y-%m-%d %H:%M:%S'  # 自定义格式

# 使用自定义日期格式
git log --pretty=format:"%h - %ad : %s" --date=format:'%Y-%m-%d %H:%M'

筛选历史

按数量筛选

bash
# 显示最近 n 次提交
git log -n 10
git log -10

# 跳过前 n 次提交
git log --skip=5

# 显示第 6-10 次提交
git log --skip=5 -5

按时间筛选

bash
# 指定日期之后
git log --since="2024-01-01"
git log --after="2024-01-01"

# 指定日期之前
git log --until="2024-01-15"
git log --before="2024-01-15"

# 日期范围
git log --since="2024-01-01" --until="2024-01-15"

# 相对时间
git log --since="2 weeks ago"
git log --since="1 month ago"
git log --since="3 days ago"

# 组合使用
git log --since="2024-01-01" --until="2 days ago"

按作者筛选

bash
# 按作者名筛选
git log --author="Zhang"
git log --author="Zhang San"

# 按邮箱筛选
git log --author="zhang@example.com"

# 使用正则表达式
git log --author="Zhang\|Li"

# 多个作者
git log --author="Zhang" --author="Li"

按提交信息筛选

bash
# 搜索提交信息
git log --grep="登录"

# 正则表达式
git log --grep="feat\|fix"

# 大小写敏感
git log --grep="login" -i

# 全词匹配
git log --grep="login" -F

# 多个条件(OR)
git log --grep="登录" --grep="注册"

# 多个条件(AND)
git log --grep="登录" --grep="修复" --all-match

按文件筛选

bash
# 查看特定文件的历史
git log -- filename.txt

# 查看多个文件的历史
git log -- file1.txt file2.txt

# 查看目录的历史
git log -- src/

# 查看文件移动/重命名历史
git log --follow -- filename.txt

# 查看文件差异
git log -p -- filename.txt

# 查看文件修改统计
git log --stat -- filename.txt

按内容筛选

bash
# 搜索添加或删除了特定内容的提交
git log -S "function_name"

# 搜索匹配正则表达式的内容
git log -G "function\s+\w+"

# 显示匹配的行
git log -S "function_name" -p

# 搜索特定文件中的内容
git log -S "function_name" -- "*.php"

按提交范围筛选

bash
# 查看两个提交之间的历史
git log commit1..commit2

# 查看某个提交之后的历史
git log commit1..

# 查看某个提交之前的历史
git log ..commit1

# 查看分支差异
git log main..feature

# 查看两个分支的并集
git log main...feature

# 查看合并提交
git log --merges

# 查看非合并提交
git log --no-merges

图形化显示

基本图形

bash
# 显示分支图形
git log --graph

# 输出示例
* commit abc1234 (HEAD -> main)
| Author: Zhang San <zhang@example.com>
| Date:   Mon Jan 15 10:00:00 2024 +0800
|
|     feat: 添加用户登录功能
|
* commit def5678 (origin/main)
| Author: Li Si <li@example.com>
| Date:   Sun Jan 14 15:30:00 2024 +0800
|
|     fix: 修复登录验证 bug

简洁图形

bash
# 单行图形
git log --graph --oneline

# 输出示例
* abc1234 (HEAD -> main) feat: 添加用户登录功能
* def5678 (origin/main) fix: 修复登录验证 bug
| * ghi9012 (feature) feat: 新功能
|/
* xyz5678 feat: 初始化项目

# 显示所有分支
git log --graph --oneline --all

# 显示分支标签
git log --graph --oneline --decorate

# 完整图形
git log --graph --oneline --decorate --all

美化图形

bash
# 美化输出(推荐)
git log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

# 输出示例
* abc1234 - (HEAD -> main, origin/main) feat: 添加用户登录功能 (2 hours ago) <Zhang San>
* def5678 - fix: 修复登录验证 bug (1 day ago) <Li Si>
| * ghi9012 - (feature) feat: 新功能 (3 days ago) <Wang Wu>
|/
* xyz5678 - feat: 初始化项目 (1 week ago) <Zhang San>

# 创建别名
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"

# 使用别名
git lg
git lg --all

ASCII 艺术

bash
# 使用不同样式
git log --graph --oneline --all --decorate-refs=refs/heads

# 显示提交边界
git log --graph --boundary

# 显示父提交
git log --graph --parents

高级用法

查看文件变更历史

bash
# 查看文件每次提交的变更
git log -p -- filename.txt

# 查看文件变更统计
git log --stat -- filename.txt

# 查看文件每行修改信息
git blame filename.txt

# 输出示例
abc1234 (Zhang San 2024-01-15 10:00:00 +0800  1) <?php
def5678 (Li Si    2024-01-14 15:30:00 +0800  2)
ghi9012 (Wang Wu  2024-01-13 09:00:00 +0800  3) class UserController

# 查看特定行范围
git blame -L 10,20 filename.txt

# 追踪文件重命名
git log --follow -p -- filename.txt

查看提交详情

bash
# 查看特定提交
git show abc1234

# 查看特定提交的文件变更
git show abc1234 --stat

# 查看特定提交的特定文件
git show abc1234:filename.txt

# 查看提交的完整信息
git show --format=fuller abc1234

# 查看提交的树结构
git show abc1234^{tree}

比较提交

bash
# 比较两个提交
git log commit1..commit2

# 比较两个提交的文件差异
git diff commit1 commit2

# 比较两个提交的文件列表
git diff --name-only commit1 commit2

# 比较两个提交的统计
git diff --stat commit1 commit2

查看引用日志

bash
# 查看 HEAD 的变更历史
git reflog

# 输出示例
abc1234 HEAD@{0}: commit: feat: 添加用户登录功能
def5678 HEAD@{1}: checkout: moving from feature to main
ghi9012 HEAD@{2}: commit: feat: 新功能
xyz5678 HEAD@{3}: checkout: moving from main to feature

# 查看特定分支的 reflog
git reflog show main

# 查看最近 10 条
git reflog -10

# 查看特定时间段的 reflog
git reflog show --since="2 days ago"

批量操作

bash
# 列出所有修改过的文件
git log --name-only --pretty=format:

# 列出所有作者
git log --format='%an' | sort -u

# 统计每个作者的提交数
git shortlog -sn

# 输出示例
    50  Zhang San
    30  Li Si
    20  Wang Wu

# 统计每个作者的代码行数
git log --format='%an' | sort -u | while read name; do
    echo -en "$name\t"
    git log --author="$name" --pretty=tformat: --numstat | awk '{add+=$1; subs+=$2} END {print add," ",subs}'
done

实用技巧

快速查看

bash
# 查看最近一次提交
git log -1

# 查看最近一次提交的详细信息
git log -1 --stat

# 查看最近一次提交的完整差异
git log -1 -p

# 查看最近一次提交的文件列表
git log -1 --name-only

# 查看最近一次提交的作者
git log -1 --format='%an <%ae>'

导出历史

bash
# 导出提交历史到文件
git log --oneline > history.txt

# 导出详细历史
git log > detailed-history.txt

# 导出 JSON 格式
git log --pretty=format:'{"hash":"%H","author":"%an","date":"%ad","message":"%s"}' --date=iso > history.json

# 导出 CSV 格式
git log --pretty=format:'%H,%an,%ad,%s' --date=short > history.csv

搜索历史

bash
# 搜索包含特定内容的提交
git log -S "function_name" -p

# 搜索匹配正则表达式的提交
git log -G "function\s+\w+" -p

# 搜索特定文件的历史
git log --all --full-history -- filename.txt

# 搜索已删除文件的历史
git log --all --full-history --diff-filter=D -- filename.txt

创建别名

bash
# 常用日志别名
git config --global alias.lg "log --oneline --graph --all"
git config --global alias.lg1 "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.last "log -1 HEAD"
git config --global alias.standup "log --since yesterday --author $(git config user.name) --oneline"

# 使用别名
git lg
git lg1
git last
git standup

常见问题

问题 1:历史太多,如何快速定位?

bash
# 使用搜索
git log --grep="关键词"

# 使用时间范围
git log --since="2024-01-01" --until="2024-01-15"

# 使用文件过滤
git log -- filename.txt

# 使用作者过滤
git log --author="Zhang"

# 组合使用
git log --since="1 week ago" --author="Zhang" --grep="fix"

问题 2:如何查看已删除文件的历史?

bash
# 查看已删除文件的历史
git log --all --full-history -- deleted-file.txt

# 恢复已删除的文件
git checkout $(git rev-list -n 1 HEAD -- deleted-file.txt)^ -- deleted-file.txt

问题 3:如何查看某个功能的演进历史?

bash
# 搜索相关提交
git log --grep="功能名称"

# 查看特定文件的历史
git log -p -- path/to/feature/

# 使用标签查看版本历史
git log v1.0.0..v2.0.0

问题 4:如何比较两个分支的差异?

bash
# 查看分支差异
git log main..feature

# 查看分支差异(包含提交信息)
git log main..feature --oneline

# 查看分支文件差异
git diff main..feature --stat

# 查看分支共同祖先
git merge-base main feature

问题 5:如何查看合并历史?

bash
# 查看所有合并提交
git log --merges

# 查看非合并提交
git log --no-merges

# 查看特定分支的合并
git log --merges --first-parent main

总结

常用命令速查

bash
# 基本查看
git log                    # 完整历史
git log --oneline          # 单行历史
git log -n 10              # 最近 10 次
git log --graph            # 图形显示

# 筛选
git log --since="1 week ago"    # 时间筛选
git log --author="Zhang"        # 作者筛选
git log --grep="关键词"          # 信息筛选
git log -- filename.txt         # 文件筛选

# 格式化
git log --pretty=format:"%h - %an : %s"
git log --stat                   # 显示统计
git log -p                       # 显示差异

# 高级
git log -S "content"            # 内容搜索
git log --follow -- file.txt    # 追踪文件
git reflog                       # 引用日志

推荐别名

bash
# 配置推荐别名
git config --global alias.lg "log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
git config --global alias.last "log -1 HEAD"
git config --global alias.lga "log --graph --oneline --all"

下一步

掌握查看历史后,你已经完成了 Git 基础篇的学习。建议继续学习:

  • Git 进阶篇:分支管理、远程仓库、团队协作
  • Git 高级篇:变基、重置、钩子、内部原理