📦 Git Reset vs Revert

撤销操作的两种方式:区别、使用场景和最佳实践

git reset

git reset --soft <commit>
git reset --mixed <commit>
git reset --hard <commit>

作用:移动 HEAD 和分支引用,重写历史

适用场景:

  • ✅ 本地提交还没有推送到远程
  • ✅ 想要彻底删除某些提交
  • ✅ 想要合并多个提交
⚠️ 危险操作: 如果已经推送到远程,不要使用 reset!

🔄 git revert

git revert <commit>

作用:创建新的提交来撤销之前的更改,保留历史

适用场景:

  • ✅ 代码已经推送到远程仓库
  • ✅ 团队协作中需要撤销更改
  • ✅ 需要保留完整的提交历史
💡 安全操作: 推荐在公共分支上使用 revert!
📊 可视化演示 点击下方按钮体验效果

🎮 交互演示

💡 演示说明:
  • 初始有5个提交:A → B → C → D → E (HEAD 指向 E)
  • reset --hard:完全删除提交,工作区和暂存区都回退
  • reset --soft:回退提交,但保留工作区和暂存区的更改
  • reset --mixed(默认):回退提交和工作区,保留暂存区
  • revert:创建新的提交来撤销更改,保留历史

📋 Reset 三种模式对比

模式 命令 HEAD 位置 暂存区 工作区 使用场景
--soft git reset --soft HEAD~1 ✅ 移动 ✅ 保留 ✅ 保留 想要重新提交,保留修改
--mixed git reset --mixed HEAD~1 ✅ 移动 ❌ 清空 ✅ 保留 默认模式,想要重新添加文件
--hard git reset --hard HEAD~1 ✅ 移动 ❌ 清空 ❌ 清空 完全丢弃更改(⚠️危险)

⚖️ Reset vs Revert 详细对比

特性 git reset git revert
是否修改历史 是,重写历史 否,追加提交
提交ID变化 后续提交ID改变 新增提交,原提交保留
远程仓库影响 需要强制推送 (--force) 正常推送即可
团队协作 ⚠️ 不推荐在公共分支使用 ✅ 推荐在公共分支使用
撤销多个提交 一次操作 需要多次操作或使用范围
可追溯性 难以追溯被删除的提交 完整保留所有历史

🎯 最佳实践指南

✅ 什么时候用 revert?

  • 代码已经推送到远程仓库,其他人可能已经拉取
  • 在 main/master 等公共分支上撤销更改
  • 需要保留完整的审计轨迹
  • 团队协作项目中撤销错误提交

⚠️ 什么时候用 reset?

  • 只在本地分支使用,还没有推送到远程
  • 想要彻底删除某些提交(包括敏感信息)
  • 想要合并多个小的提交为一个
  • 个人开发分支上调整提交历史

📝 实用命令示例

# 撤销最近一次提交,但保留修改(soft reset)
git reset --soft HEAD~1

# 撤销最近一次提交,取消暂存但保留修改(mixed reset)
git reset HEAD~1

# 完全删除最近一次提交(hard reset - 危险!)
git reset --hard HEAD~1

# 撤销某个特定的提交(revert)
git revert <commit-hash>

# 撤销最近一次提交(revert)
git revert HEAD

# 撤销多个提交(revert范围)
git revert HEAD~3..HEAD

# 撤销合并提交(需要指定主线)
git revert -m 1 <merge-commit-hash>