回滾分為兩種拍鲤。
1、包回滾憋沿,線上運行的系統(tǒng)旺芽,從現在的版本回滾到之前穩(wěn)定的版本
2、代碼回滾,指git分支的游標采章,從指向當前有問題的版本改動為指向一個改分支歷史樹上沒有問題的版本运嗜。這個版本可以是曾經的commit,也可以是新建的commit
代碼回滾場景及方式
1悯舟、開發(fā)環(huán)境有一個新分支担租,共5個提交,回滾最新3個提交抵怎。僅影響用戶個人
2奋救、本地分支通過reset --hard方式做了回滾,想讓遠端一起回滾反惕。僅影響用戶個人
reset --hard后尝艘,push需要增加-f參數
3、線上產品包已經回滾到昨天版本了姿染,昨天發(fā)布分支代碼也reset --hard 對應的commit了背亥,有問題的commit又逮到發(fā)布分支了
集成分支不能使用reset --hard回滾,應該集成分支上新增commit方式進行
4悬赏、gitlab上游一個merge請求狡汉,已經合并到master了,合并commit有較大質量問題闽颇,必須回滾到之前
使用gitlab的合并請求上的revert
5盾戴、線上A產品的V6.2包有問題,已經把A產品包回滾到V6.1版本了兵多,發(fā)布分支上的代碼是否也要回滾
如果回滾后捻脖,不是源代碼問題,不需要回滾代碼中鼠。下次上線發(fā)布可婶,用來修復剛才線上問題,不用回滾代碼援雇。
圖中的具體情況信息:
????C3 打包并上線矛渴,生成線上的版本 V0529,運行正確惫搏。
????之后 C6 也打包并上線具温,生成線上版本 V0530,運行一段時間后發(fā)現有問題筐赔。C4 和 C5 并沒有單獨打包上線铣猩,所以沒有對應的線上版本。項
????目組把產品包從 V0530 回滾到 V0529茴丰,經過定位达皿,V0530 的代碼有問題天吓,但短時間不能修復,于是峦椰,項目組決定回滾代碼龄寞。C4 和 C5 沒有單獨上過線,因此從線上包的角度看汤功,不能回滾到 C4 或 C5物邑,應該回滾到 C3。
????考慮到線上包可以回滾到曾發(fā)布過的任意一個正確的版本滔金。為了適應線上包的這個特點色解,線上包回滾觸發(fā)的代碼回滾我們決定不用 一個個 revert C4、C5 和 C6 的方式餐茵,而是直接創(chuàng)建一個新的 commit冒签,它的內容等于 C3 的內容。具體回滾步驟:
? ??????$ git fetch origin
????????$ git checkout master
????????$ git reset --hard? V0529? ? ? ? # 把本地的master 分支的指針回退到 V0529钟病,此時暫存區(qū)(index)里就指向 V0529里的內容了。
????????$ git reset --soft? origin/master? # --soft使得本地的master 分支的指針重新回到 V05javascript:;30刚梭,而暫存區(qū)(index)變成 V0529的內容肠阱。
????????$ git commit -m "rollback to V0529"? # 把暫存區(qū)里的內容提交,這樣一來新生成的commit的內容和 V0529 相同朴读。
????????$ git push origin? master? ? ? ? # 遠端的master也被回滾屹徘。
6、代碼包的回滾在持續(xù)交付憑條執(zhí)行衅金,平帶能不能提供代碼意見回滾能力
平臺能提供最好了
代碼回滾原則
集成分支的代碼回滾堅決不用reset --hard的方式噪伊,原因如下:
1、集成分支的commit是項目階段性的成果氮唯,及時最近的發(fā)布不需要commit功能鉴吹,仍然需要這寫commit,以備后續(xù)使用
2惩琉、開發(fā)會基于集成分支上的commit拉取新分支豆励,如果集成分支采用reset的方式清楚,下次其他人會把新分支集成時瞒渠,會把被清除的commit申請何如