線上分支: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的那次提交。