Appearance
查看历史
概述
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 --allASCII 艺术
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 高级篇:变基、重置、钩子、内部原理
