git revert操作引起的代码丢失以及解决方案

2024-08-22 20:44

本文主要是介绍git revert操作引起的代码丢失以及解决方案,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

场景如下:

  1. 某项目下有很多开发中的分支,比如分支a,b,c,d都合并到了一个test分支上;
  2. 某次误操作将test分支内容合到了分支e上,然后紧接着又revert了这次合并,试图撤销合并;
  3. 接着将分支e合并master上线;
  4. 过了若干天,将master再合并到a,b,c,d分支上时,发现之前修改的代码被合并丢掉了。

这时候你会纳闷,为什么代码会丢掉,关于git revert的操作解释如下:

  • 创建一个新的提交:当你对某个提交(或一系列提交)执行 git revert 时,Git 会创建一个新的提交,这个新提交包含了对指定提交所做更改的“逆操作”。换句话说,它尝试将指定提交中的所有更改都“撤销”掉。
  • 保留原始提交:与 git reset 或 git rebase 不同,git revert 不会修改或删除原始提交。原始提交仍然保留在 Git 历史中,但新提交的更改会撤销它的效果。
  • 保持历史的线性(如果可能):默认情况下,git revert 会尝试在当前分支的顶部创建一个新的提交来撤销指定提交。这有助于保持历史记录的线性,尤其是在与远程仓库共享代码时。然而,如果指定的提交不是当前分支历史的一部分(例如,如果你试图从一个分支上撤销另一个不相关分支的提交),你可能需要使用额外的选项(如 --mainline)来确保正确的行为。
  • 处理合并冲突:如果撤销的提交与当前分支的更改有冲突,git revert 会停止并让你手动解决这些冲突。解决冲突后,你需要像处理任何其他合并冲突一样提交结果。
  • 影响未来的合并:由于 git revert 创建了一个新的提交来撤销原始提交的效果,这会影响未来的合并操作。如果将来某个分支(如 master)再次合并包含原始提交的分支(如 a, b, c, d),那么合并将包括原始提交和新的撤销提交。然而,由于撤销提交的存在,原始提交的效果将被抵消,因此在合并后的结果中不会看到这些更改。
  • 对公共仓库的影响:如果你已经将包含原始提交的更改推送到了公共仓库,并且想要撤销这些更改,你需要首先在你的本地仓库中执行 git revert,然后将包含新撤销提交的更改推送到远程仓库。这将确保所有与你有共享历史的协作者都能看到并接收到你的撤销操作。

总结:git revert确实可以撤销合并,但是会保留撤销的记录,再去合并相关分支时,就会出现代码丢失的情况!

解决方案:

  1. 最笨的办法,记住你分支的每次修改记录,手动补上这些代码,慢而且可能漏代码
  2. git reset到上述误操作2之前的一次提交记录,将这几天的合并master操作再重新操作一次,适用于后续合并master操作不多的情况
  3. 另辟蹊径将a、b、c、d、e的撤销的代码以简单快速并且完整的方式保留。

以a分支举例,当前在a分支,合并master后发现部分代码丢失,操作如下:

(1)先撤销合并master

git reflog

找到merge或者rebase的前一个节点

git reset --hard <commit_hash>

(2) 找到你分支a创建前的一次提交点,并以此提交点创建新分支,

git log
# 找到提交hash,以此提交点新建分支
git branch 新分支名 提交哈希值

比较分支a,将a分支原本的全部修改记录,使用git cherry-pick操作拉到【新分支】上
(3)将master分支merge到新分支上
这样操作快速方便也不怕代码丢失,如果不放心可以最后再比较下master分支,看看差异化的是否为原分支a的修改记录

如果您对技术有兴趣,友好交流,可以加v进技术群一起沟通,v:zzs1067632338,备注csdn即可

在这里插入图片描述

这篇关于git revert操作引起的代码丢失以及解决方案的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1097349

相关文章

线上Java OOM问题定位与解决方案超详细解析

《线上JavaOOM问题定位与解决方案超详细解析》OOM是JVM抛出的错误,表示内存分配失败,:本文主要介绍线上JavaOOM问题定位与解决方案的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一、OOM问题核心认知1.1 OOM定义与技术定位1.2 OOM常见类型及技术特征二、OOM问题定位工具

Python正则表达式匹配和替换的操作指南

《Python正则表达式匹配和替换的操作指南》正则表达式是处理文本的强大工具,Python通过re模块提供了完整的正则表达式功能,本文将通过代码示例详细介绍Python中的正则匹配和替换操作,需要的朋... 目录基础语法导入re模块基本元字符常用匹配方法1. re.match() - 从字符串开头匹配2.

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很

Python一次性将指定版本所有包上传PyPI镜像解决方案

《Python一次性将指定版本所有包上传PyPI镜像解决方案》本文主要介绍了一个安全、完整、可离线部署的解决方案,用于一次性准备指定Python版本的所有包,然后导出到内网环境,感兴趣的小伙伴可以跟随... 目录为什么需要这个方案完整解决方案1. 项目目录结构2. 创建智能下载脚本3. 创建包清单生成脚本4

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现在Word文档中添加文本水印和图片水印的操作指南

《Java实现在Word文档中添加文本水印和图片水印的操作指南》在当今数字时代,文档的自动化处理与安全防护变得尤为重要,无论是为了保护版权、推广品牌,还是为了在文档中加入特定的标识,为Word文档添加... 目录引言Spire.Doc for Java:高效Word文档处理的利器代码实战:使用Java为Wo

C#文件复制异常:"未能找到文件"的解决方案与预防措施

《C#文件复制异常:未能找到文件的解决方案与预防措施》在C#开发中,文件操作是基础中的基础,但有时最基础的File.Copy()方法也会抛出令人困惑的异常,当targetFilePath设置为D:2... 目录一个看似简单的文件操作问题问题重现与错误分析错误代码示例错误信息根本原因分析全面解决方案1. 确保

sysmain服务可以禁用吗? 电脑sysmain服务关闭后的影响与操作指南

《sysmain服务可以禁用吗?电脑sysmain服务关闭后的影响与操作指南》在Windows系统中,SysMain服务(原名Superfetch)作为一个旨在提升系统性能的关键组件,一直备受用户关... 在使用 Windows 系统时,有时候真有点像在「开盲盒」。全新安装系统后的「默认设置」,往往并不尽编