git revert的坑

268 阅读1分钟

问题背景

今天把一个feat分支的代码合并进了master,准备上线的时候,后端说先等等,下周再上。没办法,只能回滚master中的这次合并

WeChataf7591fd0e394d86bc36a42a83be0e30.png

点击了这个“诱人”的红色框框之后,没有任何意外,这次合并的提交被「反做」了,留下了一条revert记录,master分支里代码回到了合并之前的样子:

image.png

正当我准备重新建一个MR,方便周一上线的时候,我发现 ——— 我的feat分支被认为已经合并进master里了,所以不能再次合并了。我有点慌了,难道我要重新建一个分支,再copy一遍代码吗?

分析研究

为了图文相符,下文中的main分支,即为上文中的master分支

经过研究 git merge 和 git revert 的原理,我发现:

  • 当我们 git revert 的时候,git 分支是这样的:

image.png

  • 这个时候,在main分支上执行git merge feat,是不能把feat分支再合并进main中的,因为git认为feat分支已经被合并进main分支里了

解决方案

那我们应该怎么做呢?我们切到feat分支:

  • 把revert的这次提交拉取过来:git merge main
  • 反做上一步的revert提交:git revert HEAD或者git revert C2'(C2' 代表上一步revert提交的hash值) 此时git分支长这个样子:

image.png

这个时候就能正常地 push 然后 合并进主分支了。


文中用到的git模拟器:learngitbranching.js.org/?NODEMO=&lo…