Git 分支管理(七)

7.查看提交历史

一、查看提交历史

1. git log – 查看完整提交历史

基本语法

git log [选项] [分支名/提交哈希]

常用选项

选项 说明
-p 显示提交的补丁(具体更改内容)
--oneline 以简洁的一行格式显示提交信息
--graph 以 ASCII 图形显示分支与合并历史
--decorate 显示分支和标签指向的提交
--author=<作者> 只显示特定作者的提交
--since=<时间>​ / --after 显示指定时间之后的提交
--until=<时间>​ / --before 显示指定时间之前的提交
--grep=<模式> 只显示提交消息中包含指定模式的提交
--no-merges 不显示合并提交
--stat 显示简略统计信息(修改的文件和行数)
--abbrev-commit 使用短提交哈希值
--pretty=<格式> 使用自定义格式显示
-n <number> 限制显示的提交数量
--reverse 逆向显示日志(最早的在前)

示例

# 简洁一行显示
git log --oneline

# 图形化显示分支历史
git log --graph --oneline --decorate

# 查看最近5次提交
git log -n 5

# 查看作者为 "Linus" 的最近5次提交
git log --author=Linus --oneline -5

# 查看三周前到2024-04-18之间的提交(不含合并提交)
git log --oneline --before={3.weeks.ago} --after={2024-04-18} --no-merges

# 逆向显示所有提交
git log --reverse --oneline

2. git blame – 逐行查看文件修改历史

基本语法

git blame [选项] <文件路径>

常用选项

选项 说明
-L <起始>,<结束> 只显示指定行号范围内的注释
-C 对重命名或拷贝的代码行也进行溯源
-M 对移动的代码行也进行溯源
-C -C​ 或 -M -M 对较多改动的代码行进行更进一步的溯源
--show-stats 显示每个作者的行数统计

示例

# 显示文件每一行的作者、提交哈希、日期等信息
git blame README

# 只显示第 5 到 10 行的注释
git blame -L 5,10 README

# 对重命名或移动的代码行进行溯源
git blame -C README
git blame -M README

# 显示作者行数统计
git blame --show-stats README

可使用 git blame --help 查看更多帮助。

二、版本恢复与回退

命令 说明 适用场景
git checkout <commit> -- <file> 将文件恢复到指定提交的版本 恢复单个文件,不影响其他内容
git checkout <commit> 切换到指定提交(分离头指针状态) 临时查看旧版本
git reset --soft <commit> 仅移动 HEAD,保留暂存区和工作区 撤销提交,保留修改
git reset --mixed <commit>(默认) 移动 HEAD,重置暂存区,保留工作区 撤销 git add 和提交
git reset --hard <commit> 移动 HEAD,重置暂存区和工作区 彻底丢弃所有更改(⚠️ 危险)
git revert <commit> 创建一个新提交来撤销指定提交 撤销已推送到远程的提交
git reflog 查看 HEAD 移动历史,找回丢失的提交 恢复被 reset 丢弃的提交

1. git checkout – 恢复文件或切换到旧版本

# 将 file.txt 恢复到 abc123 提交时的版本
git checkout abc123 -- file.txt

# 切换到 abc123 提交(处于分离头指针状态)
git checkout abc123

2. git reset – 重置当前分支

# 仅移动 HEAD 到 abc123,暂存区和工作区不变
git reset --soft abc123

# 移动 HEAD 到 abc123,重置暂存区,工作区不变(默认模式)
git reset --mixed abc123

# 移动 HEAD 到 abc123,重置暂存区和工作区(⚠️ 会丢失所有未提交的更改)
git reset --hard abc123

3. git revert – 撤销某次提交(推荐用于公共分支)

# 创建一个新提交来撤销 abc123 的更改
git revert abc123

4. git reflog – 查看历史操作记录

# 查看所有 HEAD 移动记录
git reflog

# 恢复 HEAD 到某个历史位置(例如 HEAD@{3})
git reset --hard HEAD@{3}

三、实例

假设提交历史为:

abc1234 Commit 1
def5678 Commit 2
ghi9012 Commit 3

操作演示

# 查看简洁历史
git log --oneline

# 切换到 Commit 2(分离头指针)
git checkout def5678

# 重置到 Commit 2,保留暂存区
git reset --soft def5678

# 重置到 Commit 2,取消暂存区更改
git reset --mixed def5678

# 重置到 Commit 2,丢弃所有更改(谨慎使用)
git reset --hard def5678

# 撤销 Commit 2(创建新提交)
git revert def5678

# 查看 reflog 找回丢失的提交
git reflog
git reset --hard HEAD@{3}

四、注意事项

  • git reset --hard会永久丢失未提交的更改,使用前请确保已备份或确认无误。
  • git revert不改变历史,适合已推送到远程仓库的提交。
  • git reflog是救命稻草,即使执行了 git reset --hard​,只要未运行 git gc​,通常仍可通过 reflog 找回。
  • 分离头指针状态下进行的提交不会被任何分支引用,如需保留,应创建新分支:git checkout -b new-branch