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 --oneline2. 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 abc1232. git reset – 重置当前分支
# 仅移动 HEAD 到 abc123,暂存区和工作区不变
git reset --soft abc123
# 移动 HEAD 到 abc123,重置暂存区,工作区不变(默认模式)
git reset --mixed abc123
# 移动 HEAD 到 abc123,重置暂存区和工作区(⚠️ 会丢失所有未提交的更改)
git reset --hard abc1233. git revert – 撤销某次提交(推荐用于公共分支)
# 创建一个新提交来撤销 abc123 的更改
git revert abc1234. 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。