详解Git合并(Merge)错误如何回退。(包括Reset, Revert和页面回滚三种,并说明其优缺点)

本文介绍了解决因错误地将测试分支合并到生产分支而产生的问题的方法。提供了三种回滚方案:使用git reset --hard命令、git revert命令及通过GitLab界面操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 问题场景描述

我的项目包含两个重要git分支:master(生产环境),develop(测试环境)。

正常的开发流程为:从master剪分支,然后进行开发,开发后合并到develop分支,当测试通过后合并到master分支进行上线。

所以,master分支和develop分支代码差别很大,包括:未上线的代码,针对develop做的特殊处理等等。

但某人错误操作,不小心从develop剪分支,最终合并到了master分支,造成develop的分支跑到了master分支上,造成生产问题。

所以需要对合并进行回退。

1.1 场景模拟

首先,我们master上有两个提交记录:

在这里插入图片描述

在这里插入图片描述

develop上也对应也有两个提交记录

在这里插入图片描述

此时我们新建一个version-20221107的分支,本应该从master上剪,结果错误的从develop上剪了。

在这里插入图片描述

此时,我们将version-20221107合并到master上(假设没有冲突):

在这里插入图片描述

之后会发现,develop的代码出现在了master上。

我们来查看master的提交记录:

在这里插入图片描述

会发现除了包含合并记录外,也包含develop的提交记录,这也是回退过程中最令人头疼的情况。

2. 解决方案

2.1 利用git reset --hard命令

说明:git reset --hard 命令是强制回到某一个版本,然后利用git push -f命令强制推到远程

优点:干净利落,回滚后完全回到最初状态。

缺点:

  1. 需要找到你要回滚的版本。如果再你合并后,又有很多提交记录,那你就很难找了。
  2. 完全删除了你指定版本之后的代码,很难找回
  3. 如果在你回滚前,有人从该分支剪出了代码,那么之后还会被合回来。
  4. 如果在你回滚前,有人提交了代码,那么你回滚后,他的代码就没了。
  5. 该分支不能是“保护分支”,否则无法强制推送,必须找管理员来做这个事。
    5

不管优点缺点吧,来试一下:

在这里插入图片描述

我们是要回退到master commit2, 但是在实际中,我们并不能一眼就看出哪些是develop的提交记录,所以很难定位到要回退到哪个版本,所以要配合如下命令:

查看分支的提交情况

git reflog

输出:

70ca41f (HEAD -> master-test, origin/master-test) HEAD@{0}: commit (merge): Merge remote-tracking branch 'origin/version-20221107' into master-test
9e47366 HEAD@{1}: checkout: moving from master to master-test

可以看到,通过该命令,并不会出现像gitlab上那么多提交记录,所以9e47366就是我们要回滚的分支。

接下来,就是强制回滚:

git reset --hard 9e47366

然后强制push

git push -f

然后再来看下git提交记录,发现合并的都没了

在这里插入图片描述

上述查找版本到reset的都可以用git reset --hard HEAD~1代替,HEAD~1表示回退到上一版本。不过个人推荐还是一步一步做,不容易出错


假设上述动作是第二天才做的,中间有一个人又从master上拉了一个version-202221108的分支:

在这里插入图片描述

我们做回退的也不知道,这个时候假设他把version-20221108合并到master上,看看会发生什么情况:

在这里插入图片描述

最后发现白回滚了,回滚的代码又回来了。这也缺点中的第三条。

不过用revert命令回滚可以避免该问题。

2.2 利用git revert 命令

说明revert 命令是“回滚”,即回滚某一次的操作。我们可以利用该来撤销合并错误。其原理为:撤销上一个版本的操作,会生成一个新的版本。相当于一次重新提交,只不过这次的提交的内容就是把上次提交的内容给还原。

优点

  1. 之前的错误提交记录可以找到。
  2. 如果别人在你回滚前剪出了分支,重新合并后不会有问题。
  3. 不需要管理员权限
  4. 如果回退前又有人提交了代码,也不会对他的提交造成影响。

缺点:不够干净,还会保留错误合并的提交记录。

接下来我们来实验下:

在这里插入图片描述

目前,我们需要对合并操作进行回滚,也就是对70ca41f4这个提交。我们只需要使用如下命令:

git revert 70ca41f4 -m 1

-m 1 是固定的,可以理解保留当前分支的代码,回滚掉来源分支的代码。

在执行完该命令后,会弹出输入comment信息,确定后,进行push即可。

在这里插入图片描述

之后可以看到生成了一条revert的记录,并且代码也回退到原状。

此时,我们再将version-20221108合并到master,结果如下(已处理冲突):

在这里插入图片描述

可以看到,虽然version-20221108分支是在回滚前剪出的,但并不会把develop的代码合并进来。


假设有人在回滚前又提交了代码:

在这里插入图片描述

在这里插入图片描述

使用Revert命令并不会对其造成影响。

2.3 使用页面进行回滚(效果与Revert一致)

说明:直接使用gitlab页面进行操作,原理与使用revert命令一致。

优点

  1. 操作简单,与使用命令效果一致。
  2. revert有的优点,它基本都有

缺点:如果你回滚的版本后面有提交,那么页面无法自动完成,需要用命令。


首先,我们选择要回滚的合并提交记录(注意:这里要选择的是“你要回滚的提交,而不是你要回滚到哪个版本”):

在这里插入图片描述

选择Revert

在这里插入图片描述

选择要Revert的分支

在这里插入图片描述

最后点击Revert就行了。

Git中,如果发生错误合并(merge),可以采取以下几种处理方法: 1. 回滚合并(commit)操作: 如果发现合并后的结果不正确,可以使用`git reset`命令来回滚合并之前的状态。具体操作如下: ``` git reset --hard <commit-id> ``` 这将把当前分支回滚到指定的提交(commit)。 2. 使用revert撤销合并: 如果希望保留合并提交记录,可以使用`git revert`命令来撤销合并。具体操作如下: ``` git revert -m 1 <commit-id> ``` 这将创建一个新的提交来撤销合并保留撤销合并的历史记录。 3. 使用交互式rebase修复合并冲突: 如果在合并过程中发生冲突,可以使用交互式rebase来修复冲突。具体操作如下: ``` git rebase -i <commit-id> ``` 在交互式rebase中,你可以选择编辑每个提交的修改内容,解决合并冲突,重新提交。 4. 使用`git cherry-pick`选择性地应用提交: 如果只需要选择性地应用某个提交(commit),可以使用`git cherry-pick`命令。具体操作如下: ``` git cherry-pick <commit-id> ``` 这将把指定的提交应用到当前分支,而不会进行合并操作。 需要注意的是,处理错误合并时,需要谨慎操作,确保不会丢失任何重要的修改或提交记录。同时,建议在处理之前创建一个备份分支,以防止意外情况发生。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [【版本控制】git错误merge操作导致分支产生脏代码问题溯源](https://blog.csdn.net/weixin_42598683/article/details/119892302)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iioSnail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值