git revert和 reset的区别

明白,这个是 Git 操作里非常核心的概念,很多人一开始容易混淆。我给你整理一个清晰对比表,再讲具体应用场景。


🧠 一、核心区别

特性 git revert git reset
功能 创建一个新的 commit来撤销之前的 commit 直接移动 HEAD,改变分支指向
历史是否改写 ❌ 不改写历史,保留所有 commit ✅ 改写历史(危险)
适用场景 已经 push 的 commit,需要撤销但保留历史 本地回退、重置分支或彻底覆盖远程
远程安全性 安全,可以直接 push 不安全,push 需要 -f--force-with-lease
对工作目录影响 可以选择保留或修改(默认保留工作区以生成 revert commit) 可以用 --soft/--mixed/--hard 决定保留或丢弃工作区

🧠 二、用法对比

1️⃣ git revert — 创建“反向 commit”

git revert <commit_id>
  • 会生成一个新的 commit
  • 内容是撤销 <commit_id> 的修改
  • 历史不会改变
  • 适合已 push 的 commit 或团队协作

特殊情况:merge commit

git revert -m 1 <merge_commit_id>
  • -m 1 指定主分支
  • 必须,否则 Git 不知道要保留哪边的改动

2️⃣ git reset — 移动 HEAD / 改写历史

# 回退到某 commit,但保留工作目录
git reset --soft <commit_id>

# 回退到某 commit,保留修改,但 unstaged
git reset --mixed <commit_id>  # 默认

# 回退到某 commit,工作目录和 staging 区全部重置
git reset --hard <commit_id>
  • 改变分支历史
  • 如果 push,需要 -f
  • 适合本地回退、撤销大量提交、回到历史版本

🧠 三、举例说明

假设历史:

A → B → C → D (HEAD)

1️⃣ 使用 revert C

git revert C

结果:

A → B → C → D → C' (HEAD)
  • 新生成一个 commit C',撤销 C
  • 历史完整,不会破坏其他人的操作

2️⃣ 使用 reset --hard B

git reset --hard B

结果:

A → B (HEAD)
  • C、D 被删除(本地不可见)
  • 如果 push,需要 git push -f
  • 危险,但可以彻底回到历史版本

🧠 四、总结

场景 选择
已经 push,想撤销某次 commit,但保留历史 git revert
本地回退,或者彻底覆盖远程 git reset --hard
想保留工作区修改 reset --soft / revert

revert是撤销,reset是回退

参考文档

https://zhuanlan.zhihu.com/p/1938562402275815984

posted @ 2026-03-24 10:48  学不会xuebuhui  阅读(4)  评论(0)    收藏  举报
Language: javascript //图片预览