当前位置: 首页 > news >正文

Git 代码误删除恢复


Git 误删代码并已合并到 master 的完整恢复流程

事故描述

  • 在特性分支11898472上提交了重要代码(提交e069f0fc:“#11898472 机房路由图标处理 2”)。
  • 错误执行了git reset,将分支回退到很久之前的版本a863d109,导致大量代码在分支上"消失"。
  • 将回退后的11898472分支直接合并到了远程master,导致团队所有人的master丢失了 3 天的代码。

恢复目标

  • 找回丢失的代码。
  • 修复远程master分支,且不能强制推送(避免影响其他同事)。

完整操作步骤

1. 查看操作历史,定位丢失的提交
gitreflog

找到被误删前的最后一次提交,例如:

e069f0fc HEAD@{8}: commit (merge): #11898472机房路由图标处理2

记下这个哈希:e069f0fc

2. 恢复本地特性分支到正常状态
gitcheckout11898472gitreset--harde069f0fc

此时,11898472分支的代码已恢复。

3. 强制更新远程特性分支
gitpush-forigin11898472

覆盖掉远程错误的11898472分支历史。

4. 第一次合并(将恢复后的特性分支合入 master)
gitcheckout mastergitmerge11898472gitpush origin master

这一步将找回的代码带入master,但由于历史中已经存在错误的合并提交,直接合并可能无法完全逆转代码丢失(或者只是为了后续revert做准备)。实际上我们还需要一个"反向提交"来精准撤销错误合并的影响。

5. 在特性分支上生成"反向提交"(revert 错误合并)

找到将错误代码带入master的那次合并提交,例如从reflog中找到的2a1964dd(那次合并把回退后的11898472并入了master)。

11898472分支上执行:

gitcheckout11898472gitrevert-m12a1964ddgitpush origin11898472
  • -m 1:保留主线(master),撤销被合并分支(11898472)引入的所有更改。
  • 这会生成一个新的提交,内容上等于把master恢复到错误合并前的状态,但历史记录是前进的,不会改写已共享的历史。
6. 第二次合并(将 revert 提交合入 master,最终修复)
gitcheckout mastergitmerge11898472gitpush origin master

这次合并把刚才的"反向提交"带入master,从而让master上的代码全部恢复。所有人的仓库在正常pull后即可得到修复后的代码。

关键原则

  • 特性分支:可使用reset --hard+push -f,因为通常只有个人使用。
  • 共享分支(如 master):绝对禁止push -freset远端历史。必须通过git revert生成新的提交来撤销错误,这样其他同事只需pull就能同步修复,不会造成强制覆盖或历史分叉。

命令速查表

步骤命令
查找丢失提交git reflog
恢复本地分支git reset --hard <正确提交哈希>
强制推送特性分支git push -f origin <分支名>
撤销错误合并(生成反向提交)git revert -m 1 <错误合并的哈希>
推送反向提交git push origin <分支名>
将修复合并到 mastergit checkout master && git merge <分支名> && git push origin master

补充说明

  • 如果后续还想把当初e069f0fc的那次提交以正常历史重新引入master,可以再执行一次git revert <revert提交的哈希>(即"反向的反向"),恢复原始更改。
  • 操作前建议对整个仓库做一次备份,以防万一。

http://www.jsqmd.com/news/895159/

相关文章:

  • Keil µVision构建流程中运行外部程序的配置指南
  • 手机热点办公必看:一招解决Win10后台svchost疯狂偷跑流量的烦恼
  • 避坑指南:Unity 2019/2020导入Standard Assets后脚本报错?两步快速修复GUIText过时问题
  • 一步到位的宝塔面板修复与重装命令清单
  • 贝叶斯联合建模:小区域估计中连续与二元数据的协同推断
  • 超越官方手册:用CoppeliaSim 4.6.0搞科研?这些隐藏技巧和实战配置你必须知道
  • 从负载变化到模式切换:一个实际案例,讲透Buck电路DCM与CCM的边界
  • AetherPane:AI生成前端代码的视觉质量自动化评审工具
  • 「新品发布」全新Alicona µCMM NEO微米级三坐标测量系统正式亮相
  • 用Unity UGUI打造游戏内的可折叠技能树或背包系统:基于Hierarchy视图的UI设计思路
  • 告别枯燥教程!用Unity复刻《超级马里奥》第一关:Tilemap实战拆解与性能优化心得
  • Jmeter 性能压测 —— 分析定位2
  • 别再让无人机‘断电炸机’了!保姆级教程:用BB响设置3.6V安全报警阈值
  • 基于WebGPU的浏览器端轻量级大语言模型推理实践
  • 别急着降级Gradle!先试试这招:彻底清理Android项目构建缓存与依赖的完整流程
  • 【C++基础篇】学习C++就看这篇--->类和对象之static成员、友元、内部类、匿名对象
  • Windows系统hidserv.dll文件丢失找不到问题解决
  • 环形定向耦合器设计避坑指南:HFSS仿真中那些容易出错的边界条件与端口设置
  • Godot游戏源码,交流学习
  • 冥想第一千八百八十九天(1889)
  • F411-WeAct(二)SPI Flash存储实战:W25Q64驱动优化与文件系统初探
  • Keil MDK编译器警告级别设置问题解析与解决方案
  • Webots新手避坑指南:从零搭建仿真环境与核心操作解析
  • 直线流:生成式模型高效采样的理论边界与多模态挑战
  • Unity 2020.2 + ShaderGraph 10.3.2 实战:从涂鸦到刮刮乐,一个RenderTexture搞定两种交互效果
  • 别再只调FOV了!Unity Camera组件这5个隐藏设置,让你的游戏画面质感飙升
  • AI幻觉深度剖析:从Claude虚构NeuroSync API看大模型事实核查
  • 构建AI命令行助手:Gemini集成与Antigravity自动化实践
  • WSL Ubuntu中安装Mermaid CLI失败解决
  • CASCADE架构:AI加速器的矩阵乘法革命