首页 > 其他分享 >git revert操作引起的代码丢失以及解决方案

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

时间:2024-08-22 19:22:46浏览次数:13  
标签:revert git 解决方案 合并 撤销 提交 分支

场景如下:

  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即可

在这里插入图片描述

标签:revert,git,解决方案,合并,撤销,提交,分支
From: https://blog.csdn.net/zzs1067632338/article/details/141435478

相关文章

  • IDEA中使用git合并分支的过程报错:cant checkout because of unmerged files
    使用idea的git插件控制代码分支合并时,由于操作不当,报错了,控制台报错如下:cantcheckoutbecauseofunmergedfiles,youhavetoresolveallmergeconflictsbeforecheckout.仔细回想报错的起因,经过大概是这样的:首先,远程仓库里面的代码版本是很老了,而本地的代码版......
  • 使用SVN服务器和GIT服务器管理同一个项目
    1. 背景软件发布版本代码需要提交公司SVN,中间开发环节代码管理采用Git,同一套代码需要同时在两个服务器间进行同步。 2. 解决方案方案1:SVN与Git共存,该方案需要手动同步本地代码、SVN服务器代码、Git服务器代码;方案2:SVN作为Git的远程分支,该方案在库搭建完成后,可以使用git自......
  • harbor重启后无法自启动解决方案
    1.创建systemd服务单元文件编辑服务文件:使用以下命令创建并编辑systemd服务文件:sudovim/etc/systemd/system/harbor.service添加以下内容:将以下内容粘贴到服务文件中:[Unit]Description=HarborDockerComposeServiceAfter=network.targetdocker.serviceReq......
  • Git 全套流程命令Command
    Git全套流程命令Command假设你已经在本地初始化了一个Git仓库,并且已经添加了远程仓库地址。1.初始化本地仓库如果你还没有初始化本地仓库,可以使用以下命令:gitinit2.添加远程仓库地址gitremoteaddorigin<remote-repository-url>例如:gitremoteaddorigi......
  • CentOS 7.4 Linux 下文件名乱码快速解决方案
    原文链接: https://blog.csdn.net/qingyujin/article/details/119026866文件是在WIndows下创建的,Windows的文件名中文编码默认为GBK,而Linux中默认文件名编码为UTF8,由于编码不一致所以导致了文件名乱码的问题,解决这个问题需要对文件名进行转码。文件名转码工具convmv没安装......
  • Git入门教程
    一、Git相关概念Git是一种分布式版本控制系统,主要用于跟踪和管理代码的变更。它由LinusTorvalds创建,最初被设计用于Linux内核的开发,现已成为软件开发过程中广泛使用的版本控制工具。1.基本概念版本控制:Git能够跟踪代码的每一次修改,并允许用户回滚到任何一个历史版本,这对......
  • gitlab runner远程连接其他服务器
    1、部署gitlabrunner2、 注册完成后 在代码仓库的根目录有一个流水线脚本 ......
  • gitlab上dev分支的代码更新覆盖到test分支
    在GitLab上,如果你想要将dev分支上的代码更新覆盖到test分支,可以通过以下步骤进行:确保你的本地仓库是最新的:使用gitfetch命令从远程仓库获取最新的分支列表和提交。gitfetchorigin切换到test分支:切换到你想要更新的分支。gitcheckouttest合并dev分支:将dev分支......
  • 从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评
    从海量信息中脱颖而出:Workflow智能分析解决方案,大语言模型为AI科技文章打造精准摘要评分体系(总篇章)1.简介该项目整合了编程、AI、产品设计、商业科技及个人成长等多领域的精华内容,源自顶尖技术企业和社群。借助先进语言模型技术,对精选文章进行高效摘要、专业评分及多语种翻译,......
  • setupres.dll丢失解决方案速递:全面修复流程,从简易排查至高级修复策略
    遇到setupres.dll文件丢失问题,可以按照以下步骤尝试修复:1.系统文件扫描:首先,利用系统自带的文件检查工具来修复潜在的系统文件问题。打开命令提示符(以管理员身份运行),输入sfc/scannow并回车,等待扫描并修复完成。2.Windows更新:确保操作系统是最新版本,因为有时这类问题可通......