当前位置: 首页
编程语言
git revert和git reset的区别【对比】

git revert和git reset的区别【对比】

热心网友 时间:2026-05-03
转载

别用 git reset --hard 去回滚别人已经拉过的提交——这是最常踩的坑,也是唯一必须先说清楚的事。

git revert和git reset的区别【对比】

免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈

在团队协作中,选错回滚命令的代价可不小。简单来说,git revertgit reset 的核心区别,就在于它们对待提交历史的态度截然不同。

git revert 会生成新提交,不改历史

你可以把 git revert 理解成一次“反向打补丁”的操作。它会对目标提交的所有变更,执行一次逻辑上的逆操作,然后将这个逆操作的结果,作为一个全新的提交保存下来。

这样一来,原来的错误提交依然安安静静地躺在历史记录里,只是它的影响被后来新增的这个“撤销提交”给抵消了。这种策略有几个明显的好处:

  • 协作友好:它天生适合那些已经推送到远程仓库、并且可能有其他同事已经拉取过的分支,比如 maindevelop
  • 历史清晰:执行后,你在 git log 里会看到两个相邻的提交:一个是当初的错误操作,另一个就是这次撤销操作。整个来龙去脉一目了然。
  • 合并安全:后续如果需要合并一些老的分支,Git 能够识别出“这个变更已经被撤销过了”,从而避免重复引入已经被回滚的修改。
  • 命令示例:撤销单个提交用 git revert abc1234;撤销一段连续的提交则用 git revert abc1234..def5678(注意这个范围是左开右闭的)。

git reset 会移动 HEAD,直接删掉提交记录

如果说 revert 是“做减法抵消”,那 reset 就更像是“让时光倒流”。它的本质是把当前分支的指针(HEAD)直接挪到某个更早的提交上,让后面的提交暂时“消失”。

不过,这里有个关键细节:reset 有三种模式,它们影响的“范围”不同,危险程度也天差地别。

  • git reset --soft abc1234:最温和的模式。只移动 HEAD 指针,暂存区和工作区的文件都保持原样。这适合你把几次提交打散后重新整理、打包。
  • git reset --mixed abc1234(默认模式):移动 HEAD 指针,同时重置暂存区,但工作区的文件修改会保留。这通常用来撤销 git add 操作,把文件放回工作区。
  • git reset --hard abc1234威力最大也最危险。HEAD、暂存区、工作区全部被重置到目标提交的状态。所有未推送的后续修改,无论是否已暂存,都将被彻底清除。

重点来了:一旦你把提交推送到远程,再在本地执行 reset --hard 回滚,那么为了同步远程,你就不得不使用 git push --force 来强制覆盖远程历史。这会直接导致其他协作者在下次拉取代码时出现混乱,是协作开发中的大忌。

选哪个?看提交是否已共享

其实选择标准非常清晰,核心就一条:那个出问题的提交,有没有离开过你的本地,进入公共视野?

  • 场景一:提交未共享。如果提交还在你本地,或者只在你自己用的特性分支上,用 git reset --hard 是最快最干净的,可以彻底抹掉痕迹。
  • 场景二:提交已共享。如果提交已经 push 到了远程,并且其他同事可能已经基于它开始了新的工作,那么必须、也只能使用 git revert。这是维护团队协作基石的基本操作。
  • 场景三:只想合并提交,不想改内容。如果你只是想删掉最近几次提交的记录,但保留那些修改内容以便重新整理,那么 git reset --soft HEAD~2git commit 是个好选择。
  • 场景四:误删了未跟踪的文件。如果不小心删了工作区的文件但还没 add,别用 reset。可以用 git checkout HEAD -- path/to/file 来恢复(在 Git 2.23 及以上版本,更推荐使用 git restore 命令)。

容易被忽略的细节

当然,这两个命令也并非完美。有些细节,平时容易忽略,关键时刻却很重要。

git revert 并非总能一帆风顺。如果目标提交之后的代码发生了大量冲突性的修改,那么执行 revert 时可能会失败,需要你手动介入解决冲突。

git reset --hard 的危险性,有时比想象中更隐蔽。它清除的不仅仅是提交记录。举个例子,如果你刚刚 git add 了一个配置文件但还没 commit,此时执行 reset --hard,这个暂存状态也会被一并清空,且无法通过普通的日志找回。当然,最后一根救命稻草是 git reflog,你可以通过它定位到操作前的状态,并用 git reset --hard HEAD@{1} 之类的命令捞回来,但这毕竟增加了不必要的风险和心理负担。

说到底,工具本身没有好坏,关键在于在正确的场景使用正确的工具。把握住“是否已共享”这个分水岭,就能在代码回滚时做到既高效又稳妥。

来源:https://www.php.cn/faq/2343009.html

游乐网为非赢利性网站,所展示的游戏/软件/文章内容均来自于互联网或第三方用户上传分享,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系youleyoucom@outlook.com。

同类文章
更多
VSCode快速打开文件:使用Ctrl+P组合键定位项目资源技巧

VSCode快速打开文件:使用Ctrl+P组合键定位项目资源技巧

Ctrl+P搜不到文件?问题可能出在工作区索引上 遇到Ctrl+P搜不到文件的情况,先别急着怀疑快捷键失灵。十有八九,问题根源在于文件压根没被索引进工作区。这个功能依赖的是对当前工作区的完整索引,而非全局磁盘扫描。 Ctrl+P搜不到文件的三个典型原因 VSCode的Ctrl+P(在macOS上是C

时间:2026-05-03 22:47
Sublime如何实现代码实时查错_Sublime安装SublimeLinter插件教程

Sublime如何实现代码实时查错_Sublime安装SublimeLinter插件教程

Sublime如何实现代码实时查错_Sublime安装SublimeLinter插件教程 先说一个核心事实:Sublime Text 编辑器本身并不具备代码检查能力。 它实现实时查错,靠的是一个名为 SublimeLinter 的框架,再加上外部的命令行工具(比如 ESLint、Flake8)来协同

时间:2026-05-03 22:47
git重命名分支的正确操作【详解】

git重命名分支的正确操作【详解】

Git分支重命名:一个操作,三重陷阱 把git branch -m当成“一键改名”来用,是很多开发者踩坑的开始。这个命令只动了本地,远程仓库里旧分支依然挂着,新分支压根不存在。结果呢?CI CD流水线可能还在跑旧分支,Pull Request的指向一片混乱,团队协作瞬间陷入泥潭。 最安全的路径:在当

时间:2026-05-03 22:47
VSCode编辑器状态栏隐藏_追求极简全屏开发环境设置

VSCode编辑器状态栏隐藏_追求极简全屏开发环境设置

VSCode状态栏消失通常因误触发View: Toggle Status Bar命令、进入Zen Mode或系统全屏模式,而非崩溃;恢复只需再次执行该命令、退出Zen Mode(Esc)或取消F11全屏。 先别慌,VSCode的状态栏其实不是“丢了”,它大概率只是被关掉了。绝大多数情况下,这都是一次

时间:2026-05-03 22:47
VSCode配置FastAPI异步 接口开发VSCode自动文档补全

VSCode配置FastAPI异步 接口开发VSCode自动文档补全

VSCode中FastAPI接口不提示async await,根本原因是Pylance默认未开启异步函数深度推导,需启用类型检查、显式标注返回类型、规范Pydantic联合类型写法、避免async中混用yield。 VSCode里FastAPI接口不提示async await怎么办 很多开发者都遇到

时间:2026-05-03 22:47
热门专题
更多
刀塔传奇破解版无限钻石下载大全 刀塔传奇破解版无限钻石下载大全
洛克王国正式正版手游下载安装大全 洛克王国正式正版手游下载安装大全
思美人手游下载专区 思美人手游下载专区
好玩的阿拉德之怒游戏下载合集 好玩的阿拉德之怒游戏下载合集
不思议迷宫手游下载合集 不思议迷宫手游下载合集
百宝袋汉化组游戏最新合集 百宝袋汉化组游戏最新合集
jsk游戏合集30款游戏大全 jsk游戏合集30款游戏大全
宾果消消消原版下载大全 宾果消消消原版下载大全
  • 日榜
  • 周榜
  • 月榜
热门教程
更多
  • 游戏攻略
  • 安卓教程
  • 苹果教程
  • 电脑教程