Git对MR进行revert

别再乱用Git Revert了!团队协作中规避‘幽灵合并’问题的保姆级操作指南(附GitLab实战) 本文详细解析团队协作中使用Git Revert时常见的‘幽灵合并’问题,提供基于GitLab的完整解决方案。通过安全回滚流程设计、双Revert技巧和自动化验证,帮助开发者规避版本混乱,提升团队协作效率。 阅读详情
AI摘要

本文深入解析Git中revert命令的使用,区分常规commit与merge commit的回滚方式,演示如何精确撤销特定commit,以及在团队协作中如何妥善处理revert后的代码合并,确保项目历史的清晰与正确。

revert 可以取消指定的某次提交内容。

当讨论 revert 时,需要分两种情况,因为 commit 分为两种:一种是常规的 commit,也就是使用 git commit 提交的 commit;另一种是 merge commit,在使用 git merge 合并两个分支之后,你将会得到一个新的 merge commit。

merge commit 和普通 commit 的不同之处在于 merge commit 包含两个 parent commit,代表该 merge commit 是从哪两个 commit 合并过来的。
在这里插入图片描述

在上图所示的红框中有一个 merge commit,使用 git show 命令可以查看 commit 的详细信息

➜  git show bd86846
commit bd868465569400a6b9408050643e5949e8f2b8f5
Merge: ba25a9d 1c7036f

这代表该 merge commit 是从 ba25a9d 和 1c7036f 两个 commit 合并过来的。

而常规的 commit 则没有 Merge 行

➜  git show 3e853bd
commit 3e853bdcb2d8ce45be87d4f902c0ff6ad00f240a

revert 常规 commit

使用 git revert 即可,git 会生成一个新的 commit,将指定的 commit 内容从当前分支上撤除。

revert merge commit

revert merge commit 有一些不同,这时需要添加 -m 选项以代表这次 revert 的是一个 merge commit

但如果直接使用 git revert ,git 也不知道到底要撤除哪一条分支上的内容,这时需要指定一个 parent number 标识出"主线",主线的内容将会保留,而另一条分支的内容将被 revert。

如上面的例子中,从 git show 命令的结果中可以看到,merge commit 的 parent 分别为 ba25a9d 和 1c7036f,其中 ba25a9d 代表 master 分支(从图中可以看出),1c7036f 代表 will-be-revert 分支。需要注意的是 -m 选项接收的参数是一个数字,数字取值为 1 和 2,也就是 Merge 行里面列出来的第一个还是第二个。

我们要 revert will-be-revert 分支上的内容,即 保留主分支,应该设置主分支为主线,操作如下:

➜ git revert -m 1 bd86846

revert 之后重新上线

假设狗蛋在自己分支 goudan/a-cool-feature 上开发了一个功能,并合并到了 master 上,之后 master 上又提交了一个修改 h,这时提交历史如下:

a -> b -> c -> f -- g -> h (master)
           \      /
            d -> e   (goudan/a-cool-feature)

突然,大家发现狗蛋的分支存在严重的 bug,需要 revert 掉,于是大家把 g 这个 merge commit revert 掉了,记为 G,如下:

a -> b -> c -> f -- g -> h -> G (master)
           \      /
            d -> e   (goudan/a-cool-feature)

然后狗蛋回到自己的分支进行 bugfix,修好之后想重新合并到 master,直觉上只需要再 merge 到 master 即可(或者使用 cherry-pick),像这样:

a -> b -> c -> f -- g -> h -> G -> i (master)
           \      /               /
            d -> e -> j -> k ----    (goudan/a-cool-feature)

i 是新的 merge commit。但需要注意的是,这 不能 得到我们期望的结果。因为 d 和 e 两个提交曾经被丢弃过,如此合并到 master 的代码,并不会重新包含 d 和 e 两个提交的内容,相当于只有 goudan/a-cool-feature 上的新 commit 被合并了进来,而 goudan/a-cool-feature 分支之前的内容,依然是被 revert 掉了。

所以,如果想恢复整个 goudan/a-cool-feature 所做的修改,应该先把 G revert 掉:

a -> b -> c -> f -- g -> h -> G -> G' -> i (master)
           \      /                     /
            d -> e -> j -> k ----------    (goudan/a-cool-feature)

其中 G’ 是对 G 的 revert 操作生成的 commit,把之前撤销合并时丢弃的代码恢复了回来,然后再 merge 狗蛋的分支,把解决 bug 写的新代码合并到 master 分支。

参考

  1. http://blog.psjay.com/posts/git-revert-merge-commit/
  2. https://stackoverflow.com/questions/9059335/how-to-get-the-parents-of-a-merge-commit-in-git
Git误操作急救手册 本文提供了一份Git误操作急救手册,针对开发中常见的Git操作失误进行分类指导。手册覆盖工作区、暂存区、本地仓库、分支操作、远程推送及合并冲突等场景,提供具体解决方案如git restore、git reset、git reflog等命令的使用方法。重点强调"先备份后操作"原则,推荐使用git reflog作为终极恢复工具,并给出团队协作下的复杂场景处理建议。同时提出预防措施,包括规范操作流程、使用GUI工具、设置分支保护等。最后总结急救口诀和快速索引表,帮助开发者快速定位问题并安全恢复 阅读详情

相关推荐

gitlab撤销已经合并到master的提交

gitlab撤销已经合并到master的提交一、Commits页面选择已经提交的合并请求二、选择Revert三、提交撤销合并请求四、同意撤销合并请求 一、Commits页面选择已经提交的合并请求 二、选择Revert 三、提交撤销合并请求 四、同意撤销合并请求 至此master回退到上一个版本。 ...

zhengzaifeidelushang的博客 6284

手把手教你处理Git revert merge后的‘幽灵合并’问题(含GitLab分支保护设置)

本文详细解析了Git revert合并后出现的'幽灵合并'问题,提供了三种实战恢复方案,并对比了它们的优缺点。特别强调了GitLab分支保护的最佳实践,帮助团队在紧急回滚时避免代码丢失,同时维护良好的协作流程。

weixin_30660027的博客 256

本地部署 Bolt.new - 小学生都能轻松搭建AI编程环境

本地部署 Bolt.new - 小学生都能轻松搭建AI编程环境

engchina的专栏 8624

解决git revert后再次merge代码丢失问题

问题场景 公司使用gitlab作为代码管理工具,开发人员新功能开发结束时(开发分支:feature-member),合并代码需要提交mr(pr)给相关负责人,由负责人将代码合并到master。此时产品说暂时不上线此版本,和下一个版本一起发布,为了保证master分支代码的准确性,我们使用git revert将本次mr撤销。 然后等下个版本开发完成后,提交了mr,发现变动的文件只有revert之后的变动,第一次mr的文件改动都没有了(git revert后再次merge,git默认会丢弃这段代码)。 解决方案

陈旭猿的博客 4012

ROS2初级面试题汇总

总结和收集了一些关于ros2的问题和解答记录

qq_57633442的博客 5559

DEAP数据集实战:用PyTorch搭建DNN/CNN脑电情绪识别模型(附完整代码)

本文详细介绍了如何使用PyTorch搭建DNN和CNN模型对DEAP数据集进行脑电情绪识别。从数据预处理到模型架构设计,再到训练优化和部署,提供了完整的实战指南和代码示例,帮助研究者快速掌握脑电信号识别技术。

k8l9m0n的博客 392

Git--------reset、revert以及rm命令(主要是撤销回滚版本)

git reset

weixin_43743711的博客 2390

AI 小说生成器本地部署完全指南

这篇文章介绍了本地部署AI小说生成器的完整指南,主要面向网文作者、内容创作者和AI爱好者。文章从环境搭建到创作实践,详细讲解了三种主流部署方案:Ollama(推荐新手)、LMStudio(图形界面)和text-generation-webui(高级定制)。内容涵盖硬件需求、系统架构、模型选择、API对接、提示词工程等关键技术环节,并提供了小说创作的特制提示词模板和参数调优建议。文章还讨论了长篇小说管理、多模型协作等进阶技巧,以及版权伦理等法律问题。最后推荐了相关工具资源和社区论坛,帮助读者实现安全、高效、可

珂珂可爱多 2252

如何使用 Git 优雅的回滚

开发过程中,我们经常会遇到代码回滚的情况。正常人都知道,git 回滚有两大宝: git revert git reset 当我们在本地开发,还未 git push 到远端时,可以毫无顾忌的使用 git reset 进行回滚。更多的情况中,我们不仅 push 了,而且由于开发周期长,在开发过程中不断的 merge master 和 merge other-branch 以发布到预发环境测试或者多需求合并测试。 突然 上线后用户投诉,需要马上下线本次需求中的 A、B、C,只保留 D、E、F,迅速回滚,不

高先生的猫 977

AUTOSAR内存篇 -内存驱动(Mem)

Mem驱动程序的task是基于底层内存设备技术的物理分段的低级内存访问。Mem驱动程序的API与内存设备技术无关,因此向存储器访问模块上层提供了与存储器设备无关的接口。所有高级功能(如跨段操作)都由内存访问模块处理,以尽可能降低Mem驱动器的复杂性和占用空间。Mem驱动API命名、类型定义和文件命名规则都遵循标准的AUTUSAR BSW模块实现。服务Mem_Init初始化Mem驱动的内部状态,并设置Mem驱动Job处理状态到MEM_JOB_OK。

IOT2017的博客 713

【Flutter 问题系列第 16 篇】如何防止软键盘弹出后顶掉内容

Flutter 如何防止软键盘弹出后顶掉内容

“Allen Su”的博客 3316

【git】如何快速准确的回退(revert)已经合并(merge)主分支(master)的新提交代码

我们在做一些需求,正常流程经过开发,测试到最后和代码上线。但是有时候就会发生一些小插曲,比如产品说老板说某某某你的代码要延后上线!!或者你写的不合格预发环境出问题了!!你都需要revert代码,回退成你merge之前的主分支。那么如何快速精准的做呢?这样不仅快速而且不用手动修改代码,下次要是还需要merge,只需要去revert你revert掉的代码就可以了。

qq_42961251的博客 5058

GEE生物量碳储量——利用sens和MK检验方法计算1987-2022年森林地上生物量AGB和碳储量的时空变化特征

本文是将之前已经处理好的森林生物量和碳储量数据保存到GEE Assets中,然后分别将单张影像导入到代码编辑器中,构建一个时间序列集合,并且这里需要用到的是我们给影像添加指定的时间属性,这样方便进行下一步的时序分析和空间预测。首先,需要收集1987年至2022年期间森林地上生物量AGB和碳储量数据。该数据可以通过森林清查数据、卫星遥感数据等途径获取。然后,根据这些数据,可以使用sens(敏感性分析)和MK(Mann-Kendall)方法计算时空变化特征。

此星光明博客 1264

git的使用总结

git的使用一、正常的迭代步骤二、checkout 命令的使用功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入 一、正常的迭代步骤 在正常项目的迭代开发过程中 如何安装git以及如何配置已省略 在开始开发前,须开启一个新分支,对于

qq_42607189的博客 308

【AI理论学习】深入理解扩散模型:Diffusion Models(DDPM)(理论篇)

继OpenAI在2021提出的文本转图像模型之后,越来越多的大公司卷入这个方向,例如谷歌相继推出了和。一些主流的文本转图像模型,例如,和采用了扩散模型()作为图像生成模型,这也引发了对扩散模型的研究热潮。与GAN相比,扩散模型训练更稳定,而且能够生成更多样的样本,OpenAI的论文也证明了

小哲的博客 5212

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

有趣的git

总算把这些基础的东西,写完了后面应该会写一些git flow三种流,以及CI/CD,以及一些git小技巧。题外话,今年面试确实有点难约,可能大伙需要再等个1个月看看,学习学习准备准备,不会有人觉得讲git也算八股文把面试也不考这个是不是自己不懂的都叫八股文啊。

qq_35485206的博客 1001

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

GitLab仓库已合并的代码回退---git revert

要回退develop分支上这两个合并提交,优先用 revert。

baidu_37973494的博客 827

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

已合并代码安全回退:git revert原理、-m参数与保护分支实操

版本控制中的代码回退,核心是区分改写历史与追加历史:git reset 适合本地未推送提交整理,而 git revert 通过反向补丁生成新提交,在不改写已公开历史的前提下撤销变更。面对合并提交时,-m 参数用于指定主线父提交,选择错误会导致回退方向相反;在 GitLab 保护分支和 MR 流程下,revert 还能保留责任链与 CI 可追溯性。它适用于线上故障止血、已发布功能撤回、多人协作仓库的合并代码回退等场景,并需配合冲突处理、构建验证与恢复计划。围绕已合并代码的安全撤回,进一步拆解 revert 原

weixin_27743991的博客 253

IM线上事故复盘:从已读回执异常到Git分支管理的核心防线

在软件工程实践中,版本控制与代码协作是研发团队的基石,而分支管理则是其中最容易失控的环节。当线上系统出现状态一致性异常,比如IM消息已读回执错乱,排查过程往往指向代码历史中的“旧实现回归”。Git作为最主流的分布式版本控制系统,其分支模型、合并策略、保护机制与回滚操作,直接决定了代码变更的可控性和可追溯性。本文从一次典型的线上故障出发,剖析分支生命周期不完善如何导致过期代码被重新合入主干,进而引发服务性能劣化。内容涵盖Git Flow等主流分支模型的选型对比、merge与revert的正确使用姿势、hotf

weixin_27743991的博客 96

Git合并请求全攻略:从分支管理到代码评审的实践指南

版本控制是现代软件开发的基石,而Git作为最流行的分布式版本控制系统,其核心工作流离不开分支与合并。当开发者需要将功能分支合入主分支时,合并请求(Merge Request)成为一道关键的安全闸门。它不仅是代码合入的申请流程,更承载着代码审查(Code Review)、CI检查、变更记录等团队协作核心机制。通过规范的MR流程,团队可以有效防止主分支被污染,提升代码质量,并留下完整的决策轨迹。在实际开发中,从分支命名、提交信息到合并策略的选择,每一个细节都影响着协作效率。本文结合工程实践,系统讲解Merge

weixin_28677451的博客 245

项目开发拉取提交代码流程总结(Git)

团队开发Git项目

Mark_Australia的博客 187

Gitea撤销合并请求开发规范

本文详细规定了Gitea平台中撤销合并请求的标准操作流程。规范要求从受保护分支develop创建专用revert分支,通过git revert -m 1命令撤销特定合并提交,并推送至远程仓库发起新合并请求。强调禁止强制回滚、直接修改受保护分支等危险操作,确保操作可追溯且符合分支保护机制。规范包含具体操作步骤、验证方法、禁止事项及技术说明,特别指出合并提交的双父特性要求必须使用-m 1参数。该流程通过审核机制保障撤销操作的安全性和合规性。

宋冠巡的博客 619

初学编程——简介git常见命令

本文总结了Git常用命令及团队协作开发流程。主要内容包括:本地仓库操作(初始化、分支管理、提交修改)、远程仓库交互(拉取、推送代码)、协作开发(合并分支、解决冲突、rebase)、提交规范与历史管理(日志查看、版本回退)、团队高级用法(代码评审、子模块、多远程仓库)等。重点介绍了日常开发流程:创建功能分支、提交代码、推送分支、提交PR/MR、解决冲突等规范操作,帮助开发者高效使用Git进行版本控制和团队协作。

Jimmdil的博客 1004

Git合并分支全流程:三方合并、冲突解决与团队协作

在版本控制与团队协作中,分支合并是高频且易出错的操作。Git 合并底层采用三方合并机制,以 merge base 为共同祖先,比较当前分支、被合并分支和基点三份快照,进而判断自动合并或冲突。理解 fast-forward、merge commit 与 --no-ff、--squash 的差异,能帮助工程团队选择合适历史形态,降低冲突与回滚成本。典型场景覆盖特性分支同步、MR/PR 评审、主干保护与发布回退。这些核心概念最终对应到 Git 合并分支的完整流程实践:从分支准备、命令选型、冲突裁决到验证与补救。

weixin_42529328的博客 147

Git拉取与合并:从原理到冲突解决实战指南

版本控制是团队协作的基石,而代码同步与整合则是最常见的日常操作。很多开发者习惯把拉取代码当作一键完成的黑盒,却忽略了它底层由获取与合并两个动作组成。理解这个过程,不仅能帮助你掌握提交历史的演进方式,还能在冲突出现时保持清晰的判断。从远程分支跟踪到快进合并与三方合并,再到差异比对与状态检查,这些基础原理共同构成了高效协作的底层支撑。在实际开发中,无论是多分支并行开发、代码评审前的更新同步,还是解决合并时的代码冲突,都离不开对这些概念的深刻理解。本文围绕拉取与合并的完整链路,拆解核心操作流程,结合常见报错与回滚

weixin_31842715的博客 252

【Git 避坑指南】切记不要在 GitLab 解决 daily/dev 冲突!Git 回退 Merge 记录完整方案

【Git 避坑指南】切记不要在 GitLab 解决 daily/dev 冲突!Git 回退 Merge 记录完整方案

weixin_45549481的博客 597
上一篇: 使用BeanUtils完成Bean拷贝
下一篇: Spring常用注解总结
RunAtWorld
博客等级 码龄12年 23粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值