news 2026/9/6 1:16:46

Git 操作后悔药:reset、revert、cherry-pick 详解,拯救你被覆盖的生产环境代码

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Git 操作后悔药:reset、revert、cherry-pick 详解,拯救你被覆盖的生产环境代码

🚑 前言:不要慌,Git 很难丢数据

Git 的设计哲学是“只增不减”。只要你 commit 过,哪怕你删了分支、重置了指针,代码大概率还在.git目录的深处躺着。
我们需要的,只是找到正确的工具把它捞回来,或者把错误的修改抹掉。


⏪ 一、 时光倒流:git reset (重置)

场景:你刚提交了几个 commit,发现代码写得太烂,或者提交信息写错了,想在本地撤销这些提交,重头再来。

核心原理:移动HEAD指针,让 Git 认为“那些提交从未发生过”。

三种模式对比:

模式命令参数HEAD 指针暂存区 (Index)工作区 (Work Dir)用途
Soft--soft回退保留保留最常用。撤销 commit,但代码还在,方便修改后重新提交。
Mixed--mixed回退重置保留默认模式。代码还在,但需要重新git add
Hard--hard回退重置重置 (丢失)危险!彻底回到过去,未提交的改动全丢。

实战命令:

# 1. 后悔药:撤销最近一次 commit,但保留代码修改gitreset--softHEAD^# 2. 毁灭打击:彻底回退到某个版本 (慎用!)gitreset--harda1b2c3d

⚠️ 禁忌绝对不要在公共分支(如 master/main)上使用git reset并强推 (git push -f)!这会导致同事的代码被你覆盖,引发团队格斗。


🛡️ 二、 公开致歉:git revert (反做)

场景:错误的 commit 已经推送到远程master分支了,你需要回滚,但不能使用reset(因为会破坏历史记录)。

核心原理:生成一个新的 commit,它的内容是**“反向”**操作。如果原 commit 是“新增一行”,revert commit 就是“删除那一行”。

Reset vs Revert 流程图 (Mermaid):

Revert (负荆请罪)

git revert C

Commit A

Commit B

Commit C: 错误代码

Commit D: 撤销了 C 的修改

Reset (时光倒流)

git reset --hard B

Commit A

Commit B

Commit C

HEAD 指向 B, C 消失

实战命令:

# 撤销指定的 commit idgitrevert a1b2c3d# 如果撤销产生了冲突,手动解决后:gitadd.gitrevert--continue

优点:历史记录清晰,每一笔操作都有迹可循,适合生产环境回滚。


🍒 三、 精准手术:git cherry-pick (摘樱桃)

场景:这是最高频但也最容易被忽略的场景。
你在dev分支开发新功能时,顺手修复了一个紧急 Bug (Commit Hash:fix001)。
现在,产品经理要求:“新功能不上线,但这一个 Bug 修复必须立刻上prod分支!”
你怎么把这一个commit 弄过去?切分支重写一遍?No!

核心原理:将其他分支的某一个(或几个)commit,复制一份应用到当前分支。

实战流程:

  1. 切换到目标分支(比如prod)。
  2. 执行 cherry-pick。
# 1. 切换到生产分支gitcheckout prod# 2. 把 dev 分支上的那个修复 commit "摘" 过来gitcherry-pick fix001

** Cherry-pick 逻辑演示 (Mermaid)😗*

Prod 分支

Dev 分支

git cherry-pick D2

Commit D1

Commit D2: 修复 Bug

Commit D3

Commit P1

Commit P2

Commit P3: 修复 Bug 的副本

高级技巧:

  • 批量摘取git cherry-pick A..B(不包含A,包含B)。
  • 遇到冲突:和 merge 冲突一样,解完冲突后git add .然后git cherry-pick --continue

😇 四、 上帝视角:git reflog (终极后悔药)

场景:你手贱执行了git reset --hard,把刚写的一堆代码弄丢了,而且连 commit ID 都忘了!这时候你想跳楼?

别急,Git 记录了你每一次HEAD 指针的移动(包括 reset, checkout, commit)。

实战命令:

# 查看所有操作记录 (包括被 reset 掉的)gitreflog

输出示例:

a1b2c3d HEAD@{0}: reset: moving to HEAD^ e4f5g6h HEAD@{1}: commit: 完成了核心功能 <-- 这里!你丢失的代码在这里!

复活代码:

# 只要找到那个 hash,就能跳回去gitreset--harde4f5g6h

🎯 总结

命令关键词适用场景安全性
git reset悔棋本地分支撤销提交,整理代码⚠️ 危险 (慎用 --hard)
git revert补救公共分支/生产环境回滚代码✅ 安全
git cherry-pick复制跨分支同步特定的 Bug 修复✅ 安全
git reflog复活找回被误删/重置的 commit🆘 救命专用

Next Step:
现在就在你的测试仓库里试一下git reset --hard然后用git reflog把它找回来。这种心跳的感觉,体验一次你就再也不会忘。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/5 15:09:08

【开题答辩全过程】以 基于Python的学生选课系统设计与实现为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

作者头像 李华
网站建设 2026/9/1 18:41:44

uniapp+ssm学校高校校园生活综合服务系统小程序

目录摘要技术亮点项目技术支持论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作摘要 该系统基于Uniapp与SSM&#xff08;SpringSpringMVCMyBatis&#xff09;框架开发&#xff0c;旨在…

作者头像 李华
网站建设 2026/9/5 3:19:44

uniapp+基于微信小程序的用户技能社交婚恋交友系统

目录系统概述核心功能技术亮点应用价值项目技术支持论文大纲核心代码部分展示可定制开发之亮点部门介绍结论源码获取详细视频演示 &#xff1a;文章底部获取博主联系方式&#xff01;同行可合作系统概述 该系统基于UniApp框架开发&#xff0c;结合微信小程序生态&#xff0c;构…

作者头像 李华
网站建设 2026/9/2 14:08:39

价值投资中的定性分析

价值投资中的定性分析关键词&#xff1a;价值投资、定性分析、企业竞争力、商业模式、管理层、行业趋势、护城河摘要&#xff1a;本文聚焦于价值投资中的定性分析。定性分析在价值投资中起着关键作用&#xff0c;它能帮助投资者深入了解企业的内在本质。文章首先介绍了定性分析…

作者头像 李华
网站建设 2026/8/29 6:25:16

MyBatisPlus配置复杂?我们的模型接口即插即用

VoxCPM-1.5-TTS-WEB-UI&#xff1a;让语音合成像打开网页一样简单 你有没有遇到过这样的场景&#xff1f;团队急着上线一个智能客服系统&#xff0c;产品经理说&#xff1a;“只要能读出用户问题就行”&#xff0c;结果你翻遍文档、装环境、调依赖&#xff0c;三天过去了模型还…

作者头像 李华