跳到主要内容

版本回退

本章将介绍如何查看历史、撤销修改和回退版本。

查看提交历史

基本命令

# 查看完整历史
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 指向
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

小结

本章我们学习了:

  1. 查看提交历史
  2. 版本的表示方式(HEAD、相对引用、哈希值)
  3. 撤销工作区、暂存区、提交区的修改
  4. 回退到特定版本
  5. 恢复误删的内容
  6. 比较版本差异

练习

  1. 查看项目的提交历史
  2. 尝试使用不同的方式撤销修改
  3. 使用 reflog 恢复误删的提交
  4. 比较两个版本的差异