開發過程中,我們經常會遇到代碼回滾的情況。正常人都知道,git 回滾有兩大寶:
當我們在本地開發,還未 git push
到遠端時,可以毫無顧忌的使用 git reset
進行回滾。更多的情況中,我們不僅 push 了,而且由于開發周期長,在開發過程中不斷的 merge master
和 merge other-branch
以發布到預發環境測試或者多需求合并測試。
突然
上線后用戶投訴,需要馬上下線本次需求中的 A、B、C,只保留 D、E、F,迅速回滾,不要影響更多用戶。
撕逼?那肯定是來不及了。一群人在你背后眼巴巴地盯著你,就問你慌不慌...
接下來,我們來說說,如何在緊急回滾面前,鎮定(假)自若(裝)地進行 git 操作
簡單場景
本地操作使用 git reset
隨便玩玩就行了,我們主要講講 git revert
回滾“單一提交”
回滾“連續提交”
回滾一次“合并”
回滾合并時,如果直接使用 git revert mergeCommit
實際上是遞歸回滾里面的每一個節點,指定 -m
是指定以哪一個分支為主線,當前所在分支為 1,依次類推(一次合并多個分支時會 > 2,正常只有 1 和 2)
高級場景
如果我們遇到的問題都像上面一樣,那怎么能體現一個程序員的價值?
回滾“混合場景”
如以下場景中,我們期望回歸的節點之間含有一次合并導致我們無法一次回滾到位。有兩種方式:
1. 按順序見招拆招回滾(三次操作)
2. 先回滾 D + F,再回滾合并(兩次操作)
【推薦】使用方案1,按順序回滾會處理更少的 conflict,否則假設 D、F 是一系列提交合集,那么回滾成本很高
回滾有點復雜“混合場景”
如下的場景中,特殊的地方在于,我有一個 feature,搭車了一個 bugfix,我需要回滾需求但不回滾 bug
這種情況下,有兩種選擇:
回滾 G,通過 git 引一步一步回滾 F-F'-E‘-D'-C‘-E'‘(不滾)-D'‘(不滾)-C'‘(不滾) ,回滾 E+D 【推薦】回滾 G,回滾 F 丟棄 F',回滾 D+E,復原 C‘'..E‘' 比第一種方案更快更簡單,不用處理第一種方案中的 conflict
git revert Ggit revert F -m 1git revert D..Egit cherry-pick C``git cherry-pick D``git cherry-pick E``
回滾復雜的”混合場景“
標注解釋
場景解釋 一開始你所在的團隊接到一個需求,這個需求中可以分拆出一個自需求,最終可以實現兩人并行開發
回滾方式
遇到這樣的場景,一般有如下幾種方案回滾:
git revert N`..S`// 僅回滾非 merge Master 節點,保留 Master 代碼git log B``^..L`` --first-parent --no-merges --pretty=format:%H | xargs | xargs git cherry-pick -n git revert E`..F`
最后多說一點
想要回滾不頭痛,提前就要做好功課并且保持清晰的提交記錄,否則幾百個 commit 回滾起來就變成了一場災難。提幾個好方法
保持 Commit 清晰
善用 rebase
多人并行開發,創建獨立的分支進行合并測試 不要合并到某一個分支中,防止上線時間變化導致代碼再次清洗
到此這篇關于如何使用Git優雅的回滾實現的文章就介紹到這了,更多相關Git 回滾內容請搜索武林網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持武林網!
新聞熱點
疑難解答