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

相关推荐
眼小博10 小时前
多人协作Git开发流程指南
git
lpfasd12317 小时前
git-团队协作基础
chrome·git·elasticsearch
John Song19 小时前
git多个账号管理
git·github
CV_J20 小时前
解决Git 冲突后本地提交丢失/未推送问题
git
__Witheart__20 小时前
Git 某个分支恢复到某个特定的 commit 状态
git
XU磊26021 小时前
Git 实现github仓库管理-删除指定目录下的所有文件并保留目录结构
git·github
zhimingwen1 天前
解决 GitLab Token 轮换后 SourceTree 认证失败问题
git
昵称是6硬币1 天前
代码管理——VS Code|Git
git·代码管理
Trouville011 天前
如何在VScode环境下使用git进行版本控制,并上传到gitee远程仓库
ide·git·vscode
weixin_423391931 天前
从开发到合并:AICR 项目 Git 协作提交全流程指南
git