版本回退
本章将介绍如何查看历史、撤销修改和回退版本。
查看提交历史
基本命令
# 查看完整历史
git log
# 简洁格式
git log --oneline
# 显示更多详情
git log --graph --decorate --all
# 查看每次提交的差异
git log -p
# 查看文件修改统计
git log --stat
常用选项
# 查看最近 n 条记录
git log -n
# 按时间筛选
git log --since="2024-01-01"
git log --after="2 weeks ago"
# 按作者筛选
git log --author="张三"
# 按提交信息筛选
git log --grep="bug"
# 查看特定文件的修改历史
git log --follow filename.txt
格式化输出
# 自定义格式
git log --pretty=format:"%h - %an, %ar : %s"
# 常用占位符
# %h - 短哈希
# %an - 作者名
# %ar - 相对时间
# %s - 提交说明
# %d - 引用名
版本的表示方式
HEAD
HEAD 是当前分支的最新提交:
# 查看当前 HEAD 指向
git log -1 HEAD
git show HEAD
相对引用
# 上一次提交
HEAD~1 或 HEAD^
# 上 3 次提交
HEAD~3
# 第 n 次父提交
HEAD^n(第一个父提交)
哈希值
# 使用完整哈希
git checkout abc123def456...
# 使用短哈希(至少 4 位)
git checkout abc1
撤销修改
撤销工作区修改
# 撤销特定文件的修改
git checkout -- filename.txt
# 撤销所有修改
git checkout -- .
撤销暂存
# 取消暂存特定文件
git reset filename.txt
# 取消所有暂存
git reset
撤销提交
soft 模式
# 撤销提交,保留修改在暂存区
git reset --soft HEAD~1
效果:
- HEAD 移动到上一个提交
- 修改保留在暂存区
- 工作区修改保留
mixed 模式(默认)
# 撤销提交,保留修改在工作区
git reset --mixed HEAD~1
# 或
git reset HEAD~1
效果:
- HEAD 移动到上一个提交
- 修改保留在工作区
- 取消暂存
hard 模式
# 撤销提交,丢弃所有修改
git reset --hard HEAD~1
警告:这会丢失所有修改,请谨慎使用!
效果:
- HEAD 移动到上一个提交
- 丢弃所有修改
- 不可恢复!
撤销已推送的提交
如果已经推送到远程,需要使用 revert:
# 创建新提交来撤销指定提交
git revert HEAD
# 撤销指定提交
git revert abc123
# 撤销多个提交
git revert HEAD~3..HEAD
回退到特定版本
回退到某个提交
# 方式一:重置到某个提交
git reset --hard abc123
# 方式二:创建新提交
git revert abc123
回退到某个标签
git checkout v1.0.0
# 创建新分支以查看旧版本
git checkout -b old-version v1.0.0
恢复误删的提交
使用 reflog
# 查看所有操作历史
git reflog
# 恢复误删的提交
git checkout HEAD@{2}
# 或
git reset --hard HEAD@{2}
reflog 会记录所有 HEAD 的变化,包括:
- 提交
- 切换分支
- 重置
- 克隆
恢复已删除的分支
# 查看 reflog
git reflog
# 创建新分支恢复
git branch recovered-branch HEAD@{2}
比较版本
# 比较两个提交
git diff abc123 def456
# 比较当前版本与某个提交
git diff abc123
# 比较两个分支
git diff main feature-branch
# 比较某个文件在两个版本的差异
git diff abc123 def456 -- filename.txt
版本穿梭
# 进入分离 HEAD 状态
git checkout abc123
# 返回分支
git checkout main
# 创建新分支并切换
git checkout -b new-branch abc123
小结
本章我们学习了:
- 查看提交历史
- 版本的表示方式(HEAD、相对引用、哈希值)
- 撤销工作区、暂存区、提交区的修改
- 回退到特定版本
- 恢复误删的内容
- 比较版本差异
练习
- 查看项目的提交历史
- 尝试使用不同的方式撤销修改
- 使用 reflog 恢复误删的提交
- 比较两个版本的差异