Git实战技巧-如何同时撤回远程和本地分支合并操作

9 篇文章 0 订阅

Git实战技巧-如何同时撤回远程和本地分支合并操作

1、问题场景

在新公司工作了一段时间的波仔,完成了分配给自己的任务,公司采用的是多分支模式开发,完成功能的波仔将自己的代码提交到特性分分feature_task_bobo并merge合并到了develop分支, 然后将合并结果push到了远程的develop分支, 测试部门拉取develop分支代码进行测试, 发现波仔的需求实现有偏差需要大改,且波仔的部分配置信息影响了其它功能的正常运行,项目上线在即 项目负责人决定先将波仔的合并代码取消,待需求修改完毕 bug解决掉后,在进行合并。
那么问题来了,代码目前已经完成本地merge合并 并且将merge推送到了远程仓库, 如何同时撤销本地merge 和 远程的merge操作呢?

问题演示

  1. 当前代码在develop分支
  2. 波仔 和 三毛都完成了代码 分别: (feature_task_bobo feature_task_3mao)
  3. 首先将 三毛代码进行合并 git merge feature_task_3mao
  4. 其次合并波仔代码 git merge feature_task_bobo
    合并后发现冲突

    如果这个时候, 发现波波的代码有问题决定回滚 可以直接使用取消合并的命令即可:
    // 取消本次合并
    git merge --abort
    不过暂时,以为是正常的冲突,所以波波选择解决冲突,并commit提交了代码。并且合并冲突时波仔误删了3毛的配置代码。

    如果此时,在commit了合并后,还未推送到远程分支的情况下,想要取消分支,可以通过reset重置到合并前的状态。
    git reset --hard HEAD^

    但波仔直接通过git push把合并变更推送到了远程仓库。
    测试出现问题,因为配置丢失3毛的代码报错, 并且波仔本身的代码有bug,需要将本次波仔的代码合并操作取消。
    如果此时再用 reset,那么本地的commit历史和远程commit历史就会不一致,下次提交代码会被拒绝,所以不能再使用上面两个命令:
    git merge --abort
    作用:取消本次merge
    问题:合并已完成,无法取消合并
    git reset --hard HEAD^
    作用:回退代码到上一次版本
    问题:已推送到远程,回退后和远程的仓库版本不一致

2、解决思路

通过git log查看日志

当前情况如下图:

  1. 这里是在d3节点,合并了波仔分支代码出现的问题,
  2. 可以先撤销波仔的合并操作,但不能用reset 回退版本,而是把撤销操作通过revert变为一个新的commit,
  3. 再通过push,将撤销操作推送到远程仓库,
  4. 这样本地和远程都完成撤销合并操作,
  5. 波仔把bug修复完毕后,再重新将波仔的代码合并进来。

3、具体步骤

3.1)执行git log查看日志,找到合并分支对应的版本号


3.2)develop分支执行git revert-m1 1c3420d0452551040078a830a20c3a4e491b19c8撤销合并



执行后会弹出编辑页面,直接 :wq保存即可,
命令的作用, 撤销合并的操作, 并创建一个新的commit提交记录。

执行完上面的操作,可以看到3毛的配置回来了,而波仔的代码被回退。

3.3)develop分支执行git push 将撤销合并推送到远程develop分支。


远程分支,也仅有3毛分支的代码,这样就完成了本地+远程合并分支代码的撤销操作,波仔可以继续修改自己分支的bug问题,修改完毕后,将波仔的代码重新合并到develop分支。

3.4)切换到feature_task_bobo分支,修改配置并提交。


3.5)切换到develop分支,合并波仔分支代码。



3.6)出现冲突, 解决冲突代码,解决完毕后 再次commit and push。


这样问题就全部解决啦~
执行git log查看状态

注意:
如果撤销波仔合并操作后, 再次合并波仔代码时, 发现之前参与合并过的代码无法再次合并到develop分支时,可以再一次的在develop分支执行git revert撤销合并的commit版本号,将之前撤销的波仔代码找回来即可。

4、问题小结

4.1)如果正在合并代码解决冲突中

git merge --abort 取消代码合并

4.2)如果合并完毕并commit提交到了本地仓库

git reset --hard HEAD^回退到上一个版本
后面的选项有四种:
–mixed 为默认,可以不用带该参数,用于重置暂存区的文件与上一次的提交(commit)保持一致,工作区文件内容保持不变。
–hard 参数撤销工作区中所有未提交的修改内容,将暂存区与工作区都回到上一次版本,并删除之前的所有信息提交:
–soft 仅仅修改分支中的HEAD指针的位置,不会改变工作区与暂存区中的文件的版本。

4.3)如果合并完毕,commit提交到了本地,还push到远程

git revert -m 1 HEAD 回到上一个commit的状态 (或者在git log 中找到对应的合并版本号) 即可撤回合并
git push origin master 撤回合并作为一个新的commit 推送到远程仓库

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值