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+ 强制推送(除非团队明确允许)。

相关推荐
222you19 小时前
Git的diff命令
git
补三补四20 小时前
Git 基础操作指南
大数据·git·elasticsearch
222you1 天前
git的命令
git
Coolbike1 天前
Git工作流
git
~央千澈~1 天前
实战针对本地项目git如何移除旧仓库关联并且添加关联新仓库-优雅草卓伊凡
git
JH30732 天前
git常用命令大全
git
ll5776443322 天前
使用PyTorch实现自定义损失函数以FocalLoss为例的详细教程
git
李少兄2 天前
Git 用户名与邮箱配置指南
git
Blue啊2 天前
code Merge(qcc)
git·gitlab