本文講述了如何使用 git rebase -i 及 git cherry-pick 實(shí)現(xiàn)代碼回滾。代碼回滾屬于高危操作,建議慎用或渤!
為什么會寫這樣一篇文章?其實(shí)是有一段歷史的:在一次迭代中并行開發(fā)著 n 個需求纵苛,到提測之時各需求的代碼陸陸續(xù)續(xù)被合并到了測試分支。生活本來很平靜言津,但兩天后測試的頭目說“我們組發(fā)生了點(diǎn)狀況攻人,本次迭代的需求在規(guī)定時間內(nèi)無法測完,但老板又強(qiáng)制要求了上線時間悬槽,我們把優(yōu)先級較低的需求的代碼從測試分支抽出去吧怀吻!”。當(dāng)時真是心中一萬只 XXX 飄過...
我們來模擬一下上述場景:迭代中并行開發(fā)著 3 個需求 feature1初婆、feature2蓬坡、feature3,在各自的開發(fā)分支上相安無事(假定測試分支為 master)磅叛。
其中 feature2 與 feature3 需要修改同一文件屑咳,我們故意制造了一個沖突:
提測時間到了,feature1 的代碼被合并到了測試分支:
在 feature1 修復(fù)了 1 個 bug 后弊琴,feature2 也提測了:
而后 feature3 也提測了兆龙,在合并 feature3 的代碼時,剛剛制造的沖突爆發(fā)了:
我們需要解決沖突后再合并代碼:
在 feature3 提測后敲董,我們又修復(fù)了幾個 bug:
當(dāng)然紫皇,feature2 雖已提測但并未進(jìn)入測試,bug 的修復(fù)均是針對 feature1 與 feature3 的腋寨。
此時聪铺,feature2 的測試無法正常進(jìn)行,需要將代碼從測試分支上抽出...
以防萬一萄窜,先將 feature2 分支備份:
git checkout feature2
git checkout -b feature2-copy
我們來查看一下 feature2-copy 分支的提交記錄:
git log
我們需要回滾最新的 3 個提交(因?yàn)?3 個 feature 的開發(fā)分支均是從第一個提交的時間點(diǎn)上切出的)铃剔,當(dāng)然現(xiàn)實(shí)中針對某需求的提交絕不止 3 個撒桨。若是將提交逐一 revert 那么工作量感人,我們何不將 n 個 commit 合并為一個 commit 然后一同 revert 呢键兜?
使用 git rebase -i 來合并 commit凤类,需要拼接回滾至的 commit 的 hashcode:
git rebase -i e08ddaf558b9ad84422db5e4b620dcab97623fde
而后出現(xiàn)如下對話框:
我們需要將最新 2 次提交的 command 更改為 s:
修改后保存并退出進(jìn)入如下對話框:
我們需要修改最初一次提交的 commit message:
修改后保存并退出,再次查看 feature2-copy 分支的提交記錄:
3 次提交被成功合并蝶押,可喜可賀!接下來我們需要 revert 被合并的提交:
git revert e544464c3de69adef5ca7556001abebaf40b218b
保存并退出火欧,再次查看 feature2-copy 分支的提交記錄:
此時天真的我認(rèn)為將 feature2-copy 合并到測試分支即可成功抽去 feature2 的代碼棋电,其實(shí)不然。正確的做法是使用 git cherry-pick 將 feature2-copy 分支上 revert 提交合并到測試分支上:
git checkout master
git cherry-pick b309f7944d2422d8fe647dca61bda518b192628f
此時苇侵,feature2 的代碼成功從測試分支上抽離赶盔。
最后為大家推薦一枚 Git 圖形化客戶端:GitUp
作者:呆戀小喵
我的后花園:https://sunmengyuan.github.io/garden/
我的 github:https://github.com/sunmengyuan
原文鏈接:https://sunmengyuan.github.io/garden/2017/06/15/git-revert.html