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

相关文章

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

IIS 7.0 及更高版本中的 FTP 状态代码

《IIS7.0及更高版本中的FTP状态代码》本文介绍IIS7.0中的FTP状态代码,方便大家在使用iis中发现ftp的问题... 简介尝试使用 FTP 访问运行 Internet Information Services (IIS) 7.0 或更高版本的服务器上的内容时,IIS 将返回指示响应状态的数字代

MySQL启动报错:InnoDB表空间丢失问题及解决方法

《MySQL启动报错:InnoDB表空间丢失问题及解决方法》在启动MySQL时,遇到了InnoDB:Tablespace5975wasnotfound,该错误表明MySQL在启动过程中无法找到指定的s... 目录mysql 启动报错:InnoDB 表空间丢失问题及解决方法错误分析解决方案1. 启用 inno

MySQL 添加索引5种方式示例详解(实用sql代码)

《MySQL添加索引5种方式示例详解(实用sql代码)》在MySQL数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中,下面给大家分享MySQL添加索引5种方式示例详解(实用sql代码),... 在mysql数据库中添加索引可以帮助提高查询性能,尤其是在数据量大的表中。索引可以在创建表时定义,也可

使用C#删除Excel表格中的重复行数据的代码详解

《使用C#删除Excel表格中的重复行数据的代码详解》重复行是指在Excel表格中完全相同的多行数据,删除这些重复行至关重要,因为它们不仅会干扰数据分析,还可能导致错误的决策和结论,所以本文给大家介绍... 目录简介使用工具C# 删除Excel工作表中的重复行语法工作原理实现代码C# 删除指定Excel单元

Python实现一键PDF转Word(附完整代码及详细步骤)

《Python实现一键PDF转Word(附完整代码及详细步骤)》pdf2docx是一个基于Python的第三方库,专门用于将PDF文件转换为可编辑的Word文档,下面我们就来看看如何通过pdf2doc... 目录引言:为什么需要PDF转Word一、pdf2docx介绍1. pdf2docx 是什么2. by

Spring Security介绍及配置实现代码

《SpringSecurity介绍及配置实现代码》SpringSecurity是一个功能强大的Java安全框架,它提供了全面的安全认证(Authentication)和授权(Authorizatio... 目录简介Spring Security配置配置实现代码简介Spring Security是一个功能强

python操作redis基础

《python操作redis基础》Redis(RemoteDictionaryServer)是一个开源的、基于内存的键值对(Key-Value)存储系统,它通常用作数据库、缓存和消息代理,这篇文章... 目录1. Redis 简介2. 前提条件3. 安装 python Redis 客户端库4. 连接到 Re

通过cmd获取网卡速率的代码

《通过cmd获取网卡速率的代码》今天从群里看到通过bat获取网卡速率两段代码,感觉还不错,学习bat的朋友可以参考一下... 1、本机有线网卡支持的最高速度:%v%@echo off & setlocal enabledelayedexpansionecho 代码开始echo 65001编码获取: >

Java集成Onlyoffice的示例代码及场景分析

《Java集成Onlyoffice的示例代码及场景分析》:本文主要介绍Java集成Onlyoffice的示例代码及场景分析,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要... 需求场景:实现文档的在线编辑,团队协作总结:两个接口 + 前端页面 + 配置项接口1:一个接口,将o