解決Git?Revert?再次合代碼無(wú)效問(wèn)題
背景
將開(kāi)發(fā)分支dev合并進(jìn)主分支main以后,如果發(fā)現(xiàn)bug需要回滾代碼時(shí),我們常使用git revert完成操作,但是當(dāng)我們將dev上的bug修復(fù)之后想再把它合進(jìn)main卻會(huì)發(fā)現(xiàn),dev上的功能代碼合不進(jìn)去了,原因是這些功能代碼的commit已經(jīng)在main分支上了(雖然被revert了,但仍在),所以git會(huì)拒絕合進(jìn)重復(fù)的commit。
本人最近就遇到了這種問(wèn)題場(chǎng)景,查閱網(wǎng)上資料推薦的做法一般是把main之前的revert再revert掉然后合dev,但是實(shí)際操作過(guò)程中卻發(fā)生了如下錯(cuò)誤:
不明就里,估計(jì)是因?yàn)槎嗳藚f(xié)作導(dǎo)致main分支日新月異,revert操作產(chǎn)生了不可描述的沖突,翻看長(zhǎng)串的git log已難以厘清... ...但我決定不去深究這些細(xì)節(jié),因?yàn)橐严氲礁昝赖慕鉀Q方案??!
那就是利用git rebase -i將dev的commit們 squash(壓縮)為一個(gè)commit(主要目的是生成一個(gè)新的commit哈希),然后再去rebase main分支即可,實(shí)測(cè)效果拔群??再也不用擔(dān)心類似的問(wèn)題了!
Demo復(fù)現(xiàn)該問(wèn)題
- 初始狀態(tài):基于main分支切了dev分支并開(kāi)發(fā)
- dev合并到main后
- 發(fā)現(xiàn)bug,在main上進(jìn)行回滾
- 在dev上做bugfix并測(cè)試OK
- dev重新合并到main
到這里問(wèn)題來(lái)了,我們希望得到的main分支效果應(yīng)該相當(dāng)于以下分支:
c0 <- c1 <- c2 <- c3 <- c4
但由于c2
c3
被revert掉(改動(dòng)內(nèi)容消失了),卻已經(jīng)存在于main上(重新合并時(shí)main分支認(rèn)為已經(jīng)合過(guò)它倆,于是拒絕重復(fù)引入c2
c3
),所以到第5步得到的效果實(shí)際相當(dāng)于:
c0 <- c1 <- c4
這就是標(biāo)題所說(shuō)「Git Revert之后再次合代碼無(wú)效」的問(wèn)題
用Squash方式解決該問(wèn)題
在上述Demo的步驟4基礎(chǔ)上改
1、切到dev執(zhí)行g(shù)it rebase -i,讓它自己rebase自己,目的是把dev上多個(gè)commit squash(壓縮合并)為一個(gè)commit,這個(gè)新commit將具有新的哈希值(這樣main分支就不會(huì)拒絕它了)
我們希望將c2
c3
c4
合并(即dev分支上完整的變更內(nèi)容),假設(shè)c2
的哈希值為c2_hash
,需要執(zhí)行以下shell命令
$ git checkout dev $ git rebase -i c2_hash
2、彈出的vi編輯界面如下,根據(jù)提示squash掉dev上的commit
3、填寫(xiě)commit信息,dev squash完成,效果如下
4、再用dev去rebase main分支,此時(shí)我們可以徹底忘掉git revert的黑歷史,就像將一個(gè)新鮮出爐的功能分支rebase主分支一樣,有沖突解決沖突即可
5. 再次將dev合并到main即可,完美收官!
小結(jié)
解決git revert副作用問(wèn)題,網(wǎng)上主流的方法是:
- 在main分支找到之前revert的commit(可能有多個(gè),如果是多人協(xié)作則還可能分散)
- 將之前的revert再次進(jìn)行revert
- 合dev分支,解決沖突
本文介紹的方法是:
- 在dev分支上找功能代碼涉及的commit(開(kāi)發(fā)分支上一般是連續(xù)的幾個(gè)commit,容易找)
- 將這些commit壓縮合并為一個(gè)
- dev分支rebase到main分支,解決沖突
個(gè)人比較傾向于本文這種做法,一則處理起來(lái)比較舒服,完全不用去關(guān)心之前的revert記錄;
二則看起來(lái)舒服,處理完之后dev分支較main分支只會(huì)多一個(gè)commit,這個(gè)commit包含dev上的所有功能代碼變更
以上就是解決Git Revert 再次合代碼無(wú)效問(wèn)題的詳細(xì)內(nèi)容,更多關(guān)于Git Revert 合代碼無(wú)效的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
OpenAI?函數(shù)調(diào)用示例及功能入門(mén)教程
這篇文章主要為大家介紹了OpenAI?函數(shù)調(diào)用示例及功能入門(mén)教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-06-06關(guān)于target目錄在idea沒(méi)顯示的問(wèn)題
這篇文章主要介紹了關(guān)于target目錄在idea沒(méi)顯示的問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-11-11Commitizen來(lái)規(guī)范代碼提交信息使用技巧
這篇文章主要為大家介紹了Commitizen來(lái)規(guī)范代碼提交信息使用技巧詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-03-03Git 教程之創(chuàng)建倉(cāng)庫(kù)詳解
本文主要介紹Git 創(chuàng)建倉(cāng)庫(kù)的知識(shí),這里整理了相關(guān)資料及簡(jiǎn)單示例代碼,幫助大家學(xué)習(xí)理解此部分的知識(shí),有興趣的小伙伴可以參考下2016-09-09