记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

这篇具有很好参考价值的文章主要介绍了记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在做项目时遇到了一个问题,就是不知道什么操作,无缘无故把test分支代码合并到了master,导致花了好长时间去恢复master分支的代码,所以研究了一下,到底是什么原因导致的这个问题
PS: 后来分析出来根本原因,确定这确实是IDEA的一个BUG,在下面会有详细描述

复现方式

  1. 当我们在test分支时,通过pull拉取更新代码,这时候会有一个进度条
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

  2. 进度条走完之前,我们想要去另一个分支看东西,点了checkout分支master,这时候我们切换到master分支
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

  3. pull动作走完,这时候会提示合并代码,这时候有两种情况

  • 情况一:如果有文件冲突,会弹出合并窗口,没注意点了合并代码,就会把test分支的代码合并到master分支上
    
  • 情况二:如果没有代码冲突,这时候会直接合并代码,也会把test分支的代码合并到master分支上
    
  1. 这时候可能有的同学把代码提交到远程

这将是一个很严重的问题
经过分析IDEA的日志发现,在点击更新按钮时,IDEA并没有直接执行git pull,而是拆成了两步,第一步fetch 同步线上版本,第二步merge origin/test合并远程test分支到本地HEAD(这里没有指定本地分支,所以会直接合并到HEAD分支上)。
这里就出现一个问题,两个指令就是两个锁,这种见有十秒左右的空档期,在这个空档期我们不小心切换了分支mater,就会导致HEAD指向了切换后的分支master,再执行merge origin/test ,就会导致远程test分支合并到master上,假如有冲突就会弹出合并冲突窗口,没有冲突就直接合并上去了,这里有时候是没有冲突的(我们很有可能刚刚从master拉出来分支A,A往test上合并时处理过冲突,就导致test分支合并到master分支并没有冲突)
这里假如底层使用git pull一个指令也是没有问题的,因为一个指令就是一个锁,你在执行pull过程中想要切换分支时,因为有锁,会切换失败,而不是导致合并错误

IDEA日志显示的操作过程
第一步执行 :fetch 操作
git -c core.quotepath=false -c log.showSignature=false fetch origin --recurse-submodules=no --progress --prune 
第二步执行:merge
git -c core.quotepath=false -c log.showSignature=false merge origin/test --no-stat -v 

记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

解决办法

下面是分支版本示意图
记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

情况一:关掉合并窗口,点git》合并代码》中止合并

情况二: 已合并,如果没提交到远程仓库,这时候可以用reset指令将代码恢复到指定版本4,就可以

情况三:已合并,并提交到 远程仓库 的情况下,

通过reset和revert指令,将代码版本恢复到对应版本4,这时候会生成版本6,再提交版本6到远程代码库
具体的操作验证

  1. 查看日志,记录需还原的commit版本号, git log --pretty=oneline
    git log --pretty =oneline
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

  2. 撤销已提交的commit,回滚到测试分支误合并到开发分支的commit版本
    git reset --mixed 回滚版本号
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

  3. 再次使用git log可以看到当前HEAD指向了测试分支误合并到开发分支的commit版本
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

  4. 这时候我们的代码区多了很多未暂存的文件
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

  5. 把撤销的代码文件暂存起来
    git stash save ‘保存撤销的代码’
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

  6. 再撤销当前commit并且不保留代码(因为这里的代码是从测试分支合并过来的,我们不需要这些代码)
    git revert HEAD^

注: 这里因为是merge节点直接使用git revert HEAD^ 会提示指定主分支,这里用git log -5 指令确定一下哪个是我们要恢复的主分支即可 ,最终确定主分支是第二个merge节点,所以执行git revert HEAD^ -m 2
记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案

  1. 把贮存区的代码重新应用出来
    git stash list
    git stash apply stash@{0}
    记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案
  2. 到这里就已经去掉了测试分支的代码,我们就可以push当前代码到远程了

最新方法: 直接执行 git revert 合并节点版本号 -m 主分支编号 即可

#这个案例中为
git revert   版本5 -m 2

这里介绍一下reset 和revert区别,

reset:是移动本地代码head指针到版本4 ,再pull拉取时会再把所有版本都拉取下来,再移动head指针到最新的节点,提交代码也会提示无可用的更新
revert:(git revert 节点5版本号) 进行回滚操作,创建一个新版本节点N,这个版本N是执行了一个与节点5相反的操作抵消调版本5中的所有操作,但是会保留节点5后面所有节点的操作(比如节点5后面有6、7、8修改的文件都会保留)。而且节点N是一个新的提交节点,所以revert后再提交到远程是可以提交上去的文章来源地址https://www.toymoban.com/news/detail-412866.html

到了这里,关于记录一个IDEA中使用GIT的严重BUG,导致测试分支合并到主分支,以及代码恢复解决方案的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • IntelliJ IDEA 上 使用git 合并其他分支,合并某一个提交

    IntelliJ IDEA 上 使用git 合并其他分支,合并某一个提交

    找到git——merge… 选择需要合并的分支,不能选和当前分支一样噢 合并,推送即可 点击左下角git——右键切换分支——选择需要合并的分支——选择需要合并的代码——ch 推送即可

    2024年02月04日
    浏览(99)
  • Idea 开发环境不断切换git代码分支导致冲掉别人代码

    Idea 开发环境不断切换git代码分支导致冲掉别人代码

    问题分析 使用git reflog查看执行命令,以下是发生事故的切换和提交动作 由于在feature分支和develop分支之前不停切换,导致服务器端git仓库的代码被删除了。作为一个Java老鸟,遇到这种情况还是很尴尬的。如下图红框部分的代码是将别人提交的代码直接改回去了,导致代码丢

    2024年01月22日
    浏览(14)
  • idea将一个分支指定的提交记录push到另一个分支上

    idea将一个分支指定的提交记录push到另一个分支上

     Idea将一个源分支A指定的提交记录push到另一个目标分支B上 首先,切换目标分支B; 然后\\\"git history\\\",选中源分支A,例如图中master,可以看到你需要check-pick的commit记录; 使用shift 或 Ctrl选择多个commit,点击\\\"check-pick\\\"; 把刚才check-pick的commit,git push到目标分支上; 可以解决源

    2024年02月16日
    浏览(36)
  • 【git】Idea撤回本地分支、或远程分支提交记录的各种实际场景操作步骤

    【git】Idea撤回本地分支、或远程分支提交记录的各种实际场景操作步骤

    实现效果: 撤回这个未push到远程的记录 操作步骤: 最后一次commit到本地的记录没有了, 记录回到了暂存区 有撤销记录的: 实现效果: 本质,就是重新提交对 第二次提交 删除的操作 撤销后,本地和远程分支上有撤销记录 操作步骤: 无撤销记录的: 实现效果: 远程最后

    2024年02月10日
    浏览(13)
  • git :合并某个分支上某次commit记录到另外一个分支

    需要将A分支的某次提交记录 ,合并到B分支 1)切回到 A分支 找到提交的commit id 可以使用git log 命令 或者 右键上次提交的记录 copy reversion number         git checkout A git log 2)  切回到 B分支  使用 git cherry-pick  A的 commitID ,回车 3)最后git status /git push 如果遇到问题,可以使

    2024年02月16日
    浏览(42)
  • git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支

    git的分支的使用,创建分支,合并分支,删除分支,合并冲突,分支管理策略,bug分支,强制删除分支

    查看当前本地仓库中有哪些分支 HEAD所指向的分支就是当前正在工作的分支 创建一个分支 创建好了,但是目前还是指向 master 用tree命令也可以看到已经创建分支成功了 创建出来的分支,和主分支的最新记录是一样的 切换分支就是让HEAD指向我们的dev分支 我们在dev分支上堆R

    2024年02月04日
    浏览(53)
  • idea切换分支忘记commit,导致自己辛苦写的代码被覆盖,找不回来,别慌,这里教你一个好办法找回你未提交的代码

    idea切换分支忘记commit,导致自己辛苦写的代码被覆盖,找不回来,别慌,这里教你一个好办法找回你未提交的代码

    问题描述:写了很多个接口,没有commit,然后拉取了同事的分支,发现自己写的代码全部不见了,被覆盖了. 解决思路:git没有commit,那么网上说的那些用git reflog git show git merge git reset --soft commmitld等等那些关于git的命令其实都没有意义的.正确的思路应该是从本地编辑软件的log记录入手

    2024年02月11日
    浏览(11)
  • 测试工程师的最大疑问:项目上线出现严重Bug,到底是谁的责任?

    测试工程师的最大疑问:项目上线出现严重Bug,到底是谁的责任?

    各位小伙伴们还记上个月小红书APP崩溃闪退,导致大批用户卸载APP重装的事故吗?闪退Bug从凌晨持续到第二天上午。 事发第二天,就有研发在线承认了,因为自己的失误导致了这次事件,评论区也有人担心博主会不会失去工作。 这件事会到此为止吗?有研发人员承认了错误

    2024年02月11日
    浏览(12)
  • git使用某一个分支完全覆盖另一个分支

    git使用某一个分支完全覆盖另一个分支

    比如说使用master分支覆盖dev分支 比如说使用master分支覆盖dev分支 比如说使用master分支覆盖dev分支 如果需要用master分支的代码覆盖到dev分支上,只需要如下操作: 1、切换到dev分支 2、设置本地分支代码的远程为master分支 3、本地代码已覆盖,强制推送本地分支到远程即可 4、

    2024年02月11日
    浏览(13)
  • 使用IDEA从git拉取分支

    使用IDEA从git拉取分支

    填充对应的链接 三、默认下载的是master分支,需要选取不同的分支时,可以在VCS-Git -Pull 选择具体的分支 过一段时间,等待拉取后的情况

    2024年02月11日
    浏览(9)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包