代码Revert后再次Merge会丢失的问题

问题场景

公司团队使用的是gitLab进行代码管理。因为甲方临时变动,计划好已经要发版的功能突然说不上线了,所以需要将master分支进行revert,把merge到master上的功能分支revert。

当再次通知该功能上线,重新从功能分支dev提了merge请求到master时,发现代码变动都不显示了,导致无法合并。也就是说:被回滚的代码被认为已经存在于master分支上,不算改动。

原因分析

revert操作实际是只是进行了一次逆向commit,将merge的代码进行回滚,但是commit的记录还是存在的。也就是说,dev上面存在的待提交的代码,其实已经是master的过去代码,属于已提交过的状态,所以不会显示different。

解决方案

方案1:官方推荐方案

  • 核心:对revert的那次提交记录再次revert

(1)首先,切换到master分支,并基于master分支拉出一个revert_tmp。作为master的副本,revert_tmp的作用就是保存revert的提交记录;

css 复制代码
git checkout master

git checkout -b revert_tmp

(2)其次,在master分支上找到revert的那条提交记录的版本号,回滚至之前的版本(版本号可以通过git log 命令,或者网页端查看),此操作在 revert_tmp分支上进行操作

bash 复制代码
git log 
git revert 版本号

(3)然后,切换到dev分支上,将revert_tmp这个分支merge到dev分支上。

perl 复制代码
git checkout dev
git merge revert_tmp
git push -f

(4)最后,在dev重新提交对master的merge申请,会发现revert之前的代码都回来了。

方案2:reset方案

与revert不同,采用-- git reset将head向后移动动上一次merge前的commit版本,会丢弃所有的merge commit记录(revert 不会丢弃,是逆向commit),所以,再次合并不会出现记录不显示或者冲突的问题。

perl 复制代码
git reset HEAD^

git reset HEAD^^

HEAD说明

--hard参数 参数说明
HEAD 当前版本
HEAD^ 上一个版本
HEAD^^ 上上一个版本
HEAD^^^ 上上上一个版本
以此类推......
^可以使用 ~ 数字表示
HEAD~0 表示当前版本
HEAD~1 上一个版本
HEAD~2 上上一个版本
HEAD~3 上上上一个版本
以此类推......

参考并实践:

相关推荐
霸道流氓气质13 小时前
CodeBuddy中使用 MCP 工具将 XMind 思维导图转换为 Markdown —— 实操流程汇总
git·myeclipse·xmind
OsDepK18 小时前
mimo code安装教程
git·电脑·ai编程
NexTunnel21 小时前
公司老项目还在 SVN,远程维护怎么做更稳?
git·svn·gitlab·远程工作·nextunnel
满天星83035771 天前
【Git】原理及使用(七) (多人协作 [下])
git
郡杰2 天前
Git基础与开发平台搭建
git·后端
钟智强2 天前
我警告了 329 天
git·php·wordpress·webshell
乐观的冷风2 天前
我们需要将文件添加到暂存区才能提交,而移除文件后是无法添加到暂存区的,那么怎么移除一个文件让GIT不再将其纳入版本控制呢?上图中GIT已经给出了说明:
git
tjl521314_212 天前
Git SSH Host Key Verification Failed 问题排查与解决
运维·git·ssh
嘶哈哈哈2 天前
[特殊字符] Git 协作指南
git
say_fall2 天前
【Git 精品详解】企业规范:企业级开发模型、Git Flow、发版流程规范、Code Owner 制度、事故应急回滚
大数据·linux·服务器·git·学习·elasticsearch