线上分支:mastergit
你开发的分支:dev1spa
同时开发的分支:dev23d
dev1分支开发的代码已经上线,而且已经merge到mastercode
同时dev2分支也已上线,而且已经merge到masterblog
这时发现dev1的巨大bug,线上版本要把这个分支的代码所有移除。开发
咱们要撤销全部dev1的合并,而且保留dev2的代码。rem
同时本地dev1的分支不想删除这些代码,还有在这基础上开发。同步
若是使用reset,那么线上的几个提交记录都不会保留,达不到咱们想要的效果。it
这里使用git revert。io
首先咱们要撤销全部dev1的更改,找到dev1的两次commit id
git revert 63db9b1228c9e38a015513f834a42fa55002fca8 git revert a407174c5df3e47e1866663e4c3fe611419eb5a8
此时master已经达到咱们想要的效果:
这时回到咱们的dev1分支,修复bug,我还要保留之前提交的代码。
可是在上线前总要先merge master,可是master的两次revert是领先你的,一旦merge后你的代码就没有了。
下面是当前dev1的提交状况
因此咱们要在merge master后,再使用revert撤销此次merge。
可是这时你发现,在merge完master以后你又在这个分支提交了新代码,这时revert就会报错:
git revert ce479b597de6025da4a67ddd4a94d1b8034d8c67 error: commit ce479b597de6025da4a67ddd4a94d1b8034d8c67 is a merge but no -m option was given. fatal: revert failed
这是由于撤销的是一次合并,git不知道要保存这两个分支中哪一个的修改。
-m 1 表示保留当前分支的更改
-m 2 表示保留master更改
咱们目的是为了保留dev1的代码,因此要保留当前代码,即便用 -m 1
git revert -m 1 ce479b597de6025da4a67ddd4a94d1b8034d8c67 [dev1 bb363fa] Revert "Merge branch 'master' into dev1" 2 files changed, 0 insertions(+), 0 deletions(-) rename dev2 add => b (100%) create mode 100644 c
执行完上面的代码,咱们就会发现,代码又回来了,和master没有回滚前的代码同样。
修完bug,再把当前代码合并到master,而后你就会发现,dev2提交的代码被你的merge干掉了???
这是由于你的那次rever合并采用了你的分支代码,可是你的dev1分支并无dev2的代码...
因此咱们应该在master回滚前,回到dev1分支,先merge一次最新代码,再执行后面的操做。
总结起来流程很简单。
1.保持你要开发的分支同步了master最新代码。
2.revert全部该分支的提交。
3.回到你的分支merge master。
4.revert merge master的那次提交。