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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处

Java使用Curator进行ZooKeeper操作的详细教程

《Java使用Curator进行ZooKeeper操作的详细教程》ApacheCurator是一个基于ZooKeeper的Java客户端库,它极大地简化了使用ZooKeeper的开发工作,在分布式系统... 目录1、简述2、核心功能2.1 CuratorFramework2.2 Recipes3、示例实践3

Linux samba共享慢的原因及解决方案

《Linuxsamba共享慢的原因及解决方案》:本文主要介绍Linuxsamba共享慢的原因及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录linux samba共享慢原因及解决问题表现原因解决办法总结Linandroidux samba共享慢原因及解决

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4