如何撤销Git的一次分支合并操作

合并分支的操作rebase或者merge

使用git多人协作开发同一个项目时,多人协同编写修改同一份代码时,各自在自己的分支上修改编辑代码;最终都需要保存提交到代码的主分支,这里会涉及到分支间的合并操作一般为:

git merge masterbranch
git rebase masterbranch

这两个操作都是将当前所在的分支与masterbranch分支合并;具体的区别或者合并的具体解释该篇博文暂不介绍。

如何快速安全的撤销一次合并操作?

如下当前处于开发分支developing,远端主分支为master:

这里写图片描述

两个分支各有两次提交:

这里写图片描述

在developing分支执行git merge master操作:
这里写图片描述

在这个前提下,假如突然发现合并错分支想撤销此次合并,这里介绍两个方案:

- 危险操作的保护ORIG_HEAD

根据一个stack overflow的大神的原话解释:

HEAD is (direct or indirect, i.e. symbolic) reference to the current commit. It is a commit that you have checked in the working directory (unless you made some changes, or equivalent), and it is a commit on top of which “git commit” would make a new one. Usually HEAD is symbolic reference to some other named branch; this branch is currently checked out branch, or current branch. HEAD can also point directly to a commit; this state is called “detached HEAD”, and can be understood as being on unnamed, anonymous branch.

ORIG_HEAD is previous state of HEAD, set by commands that have possibly dangerous behavior, to be easy to revert them. It is less useful now that Git has reflog: HEAD@{1} is roughly equivalent to ORIG_HEAD (HEAD@{1} is always last value of HEAD, ORIG_HEAD is last value of HEAD before dangerous operation).

大概就是git在你进行一些比较大风险性操作的时会将ORIG_HEAD指向该危险操作的起点,相当游戏中自动记录了一个复活点在ORIG_HEAD。所以在rebase后者merge操作后,如果你并没有进行任何其它操作可以直接使用

git reset --hard ORIG_HEAD 

这里写图片描述
快速撤销此次合并,非常方便好用。

- 使用git reflog实现神一般的回退

如果合并之后已经做了一些操作或者想做一些更细致的回退操作使用git reflog来查找你需要的“复活点”,事实上git会标记并记录你大部分的操作,相当于随时给你做了相当多的游戏存档,在你需要时可以选择任意存档来重新开始,但是可能会丢失掉一些修改,不了解reset操作的童鞋请先补习慎重使用。

git reset --hard HEAD@{8}

这里写图片描述

从图中可以看到,大部分的HEAD@{*}记录了你重要的提交/切换/合并等操作的点,找到你需要回退的点,执行reset操作即可实现回退。

参考的stack overflow:

http://stackoverflow.com/questions/964876/head-and-orig-head-in-git

http://stackoverflow.com/questions/134882/undoing-a-git-rebase/135614#135614

  • 8
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值