Git撤销命令revert与reset区别

今天有同事问我Git的撤销命令revert与reset有什么区别?特意整理了一下,做个比较全面的对比。总体来说,git revertgit reset 都是用于撤销更改的 Git 命令,但它们的工作方式和用途都有显著区别。

核心区别对比

特性 git revert git reset
安全性 安全 - 不改变历史记录 危险 - 会修改历史记录
操作对象 提交(commit) 提交(commit)或暂存区
历史记录 创建新的撤销提交 删除/移动提交历史
团队协作 适合共享仓库 不适合已推送的提交
工作区影响 不影响未提交的更改 根据模式影响工作区

详细说明

git revert

  • 作用:创建一个新的提交来撤销指定提交的更改

  • 使用场景:撤销已推送到远程仓库的提交

  • 命令示例

    bash 复制代码
    # 撤销最近一次提交
    git revert HEAD
    
    # 撤销指定提交
    git revert <commit-hash>
    
    # 撤销多个连续提交
    git revert <oldest-commit>..<latest-commit>

特点

  • 历史记录中会保留原提交和新创建的撤销提交

  • 可以撤销任意历史提交,而不影响后续提交

  • 适合团队协作环境

git reset

  • 作用:将当前分支重置到指定状态,有三种模式

三种模式对比

模式 工作区 暂存区 历史记录 适用场景
--soft 不变 保留更改 回退 修改提交信息
--mixed (默认) 不变 清空 回退 重新组织提交
--hard 清空 清空 回退 彻底放弃更改

命令示例

bash 复制代码
# 重置到前一个提交(保留工作区更改,取消暂存)
git reset HEAD~1

# 重置并保留更改在暂存区
git reset --soft HEAD~1

# 彻底重置,丢弃所有更改
git reset --hard HEAD~1

# 重置到特定提交
git reset --hard <commit-hash>

使用建议

使用 git revert 当:

  • 撤销已推送到远程仓库的提交

  • 需要保留完整的历史记录

  • 多人协作,避免影响他人工作

  • 只想撤销某个特定提交,而保留后续更改

使用 git reset 当:

  • 撤销本地未推送的提交

  • 需要重写本地历史(如整理提交记录)

  • 完全放弃某些本地更改

  • 注意 :如果提交已推送,需要强制推送(git push -f),这会破坏团队协作(且强制推送后会抹掉git仓库中原来的提交记录

实际示例

bash 复制代码
# 错误提交了不该提交的文件,但已推送到远程
# ✅ 正确做法:使用 revert
git revert HEAD
git push

# 本地提交了错误信息,还未推送
# ✅ 正确做法:使用 reset
git reset --soft HEAD~1
# 修改文件后重新提交
git add .
git commit -m "正确的提交信息"

# 想完全放弃最近的本地更改
# ✅ 使用 hard reset(谨慎!)
git reset --hard HEAD
# reset 后必须使用 -f 强制push才能推送成功
git push -f

重要原则

  • 已推送的提交 :总是使用 revert

  • 未推送的本地提交 :可以使用 reset

  • 未跟踪的本地更改 :使用 git checkout -- <file>git clean

记住这个简单规则:公共历史用 revert,私有历史用 reset

相关推荐
AIMath~11 小时前
如何将一个新的文件夹使用git 工具提交到github新仓库中
git·github
满天星830357712 小时前
【Git】原理及使用(二) (版本回退)
linux·git
愿天垂怜12 小时前
【C++脚手架】ffmpeg 库的介绍与使用
linux·服务器·开发语言·c++·ide·git·ffmpeg
月夜的风吹雨12 小时前
Linux 基础开发工具详解:从 yum 到 gdb 实战指南
linux·git·ubuntu·centos·vim
好运yoo13 小时前
git cherry-pick
git
不是光头 强13 小时前
Obsidian Git 插件安装与配置完全指南
git
.千余14 小时前
【C++】C++核心语法:函数重载与缺省参数原理与避坑
c语言·开发语言·c++·经验分享·笔记·git·学习
meowrain14 小时前
Git HTTPS Token 凭据配置指南
git·网络协议·https
Ws_1 天前
Git + Gerrit 第二课:diff、暂存区与撤销修改
git
snowjlz1 天前
鸿蒙版SVN来了!!!
git·svn·版本控制