git revert commit和undo commit的区别

在 Git 中,​**revert commit** ​ 和 ​**undo commit(通常通过 git reset实现)​**​ 都是撤销更改的操作,但它们的底层机制、安全性和适用场景有本质区别:


1. ​**git revert(Revert Commit)​**​

  • 作用原理​:

    创建一个新的提交 ,该提交的内容是撤销目标提交的更改​(相当于反向补丁)。

    例如:若原提交修改了文件 A.txtrevert会生成一个新提交,将 A.txt改回原样。

  • 特点​:

    • ✅ ​不修改历史记录​:原提交依然存在于 Git 历史中,只是新增了一个"撤销"提交。

    • ✅ ​安全协作 ​:适合撤销已推送到远程仓库的提交(无需强制推送)。

    • ❌ ​历史变长​:会新增一个提交,而非删除旧提交。

  • 命令示例​:

    复制代码
    git revert <commit-hash>  # 撤销指定提交
  • 适用场景​:

    撤销公共分支(如 main/master)上的错误提交,避免影响协作者。


2. ​**git reset(Undo Commit)​**​

  • 作用原理​:

    直接移动分支指针 ​(如 HEAD),丢弃目标提交之后的所有更改(或将其移到暂存区/工作区)。

    例如:若历史是 A→B→CresetB会直接删除 C

  • 特点​:

    • ⚠️ ​重写历史 ​:原提交从分支历史中消失(可通过 git reflog找回)。

    • ⚠️ ​危险协作 ​:若已推送到远程,需强制推送(git push --force),可能破坏他人代码。

    • ✅ ​彻底撤销​:本地提交可完全清除(无残留)。

  • 常用选项​:

    • --soft:保留工作目录和暂存区的更改(撤销提交但保留修改)。

    • --mixed(默认):保留工作目录更改,但重置暂存区。

    • --hard:​彻底丢弃工作目录和暂存区的更改(慎用!)。

  • 命令示例​:

    复制代码
    git reset --hard <commit-hash>  # 彻底回退到指定提交(丢弃之后所有更改)
  • 适用场景​:

    撤销本地未推送的提交,或清理实验性分支。


关键区别总结

特性 git revert git reset
历史记录 新增撤销提交,原提交保留 删除目标提交后的历史(重写历史)
安全性 安全,适合公共分支 危险,仅限本地或私有分支
远程推送 无需强制推送 --force(可能破坏协作)
数据丢失风险 无(原提交仍在) 有(--hard会永久丢弃更改)
本质 创建反向补丁 移动分支指针

如何选择?

  • 撤销已推送的提交 ​ → 用 git revert(安全)。

  • 撤销本地未推送的提交 ​ → 用 git reset(彻底)。

  • 协作分支中永远避免 git reset --hard+ 强制推送(除非团队明确允许)。

相关推荐
爱学英语的程序员1 天前
Git 提交 LF will be replaced by CRLF the next time Git touches it 报错
git
qq_339191141 天前
服务器git pull每次都要输入密码,linux 设置git登录,linux设置git只输入一次账户密码
git
一颗小行星!1 天前
快速理解 Git submodule
git
A-Jie-Y1 天前
Git基础-核心概念与常用命令
git
夜珀1 天前
Git基础修炼手册:在AtomGit上玩转版本控制
git
golang学习记1 天前
Zed IDE官宣新招:Git Graph 正式支持!
ide·git
要记得喝水1 天前
适用于 Git Bash 的脚本,批量提交和推送多个仓库的修改
git·elasticsearch·bash
AI_Claude_code1 天前
专栏导论:开源项目贡献的价值与Git工作流全景图
git·开源
never forget shyang1 天前
CCS20.2.0使用教程
c语言·git·单片机
lifewange2 天前
常用的Git命令有哪些?
git