一:背景與方案
在工作中遇見的這樣的場景:
場景一:
已經(jīng)merge到待發(fā)布的版本分支中的功能需要移除當(dāng)前的分支,改在后續(xù)版本發(fā)布,示意圖如下,展示的是commit序列,
這里想要移除的功能是commit_2的,所以需要在不改動其他commit相對順序前提下,將這個(gè)‘瘤’取下,因此這里就絕對不推薦git reset的方式,因?yàn)槿绻鹀ommit_2在末尾可以,如果不在末尾,將導(dǎo)致commit_2后的提交都被清空,這里要使用git revert的方式,像鏈表從中間刪除元素一樣,保持其他提交的順序。
git checkout -b revert_commit origin/master #從遠(yuǎn)程分支上創(chuàng)建本地的revert分支
git revert commit_2 #注意這里commit_2是指定的提交id,注意這步可能會沖突,因?yàn)橛锌赡芷渌嗽谀氵@個(gè)提交基礎(chǔ)上做了工作,要解決沖突
git add . #這一步用來解決沖突后添加文件到暫存區(qū),沒有沖突不需要
git commit -m 'revert commmit_2' #設(shè)置revert的提交信息
git push origin revert_commit:revert_commit #上傳本地的revert分支
git merge revert_commmit master #分支合并
場景二:
上一個(gè)版本已經(jīng)定了,如下的commit順序,這里commit_2是虛線表示記錄還在,但是代碼不在,可以理解為commit_2是一個(gè)加法,revert1是針對commit_2的一個(gè)減法。
問題來了,當(dāng)前master分支上是如上圖所示的提交日志,現(xiàn)在新版本又需要這個(gè)commit_2的代碼了,這里注意有一個(gè)坑的方法,我們也先說坑。
很多人覺得無所謂,我本地更新最新的master分支代碼,恰好我之前寫的commit_2本地還有分支,我直接rebase一下不就可以了嗎?而且應(yīng)該會生成一個(gè)新的commit_5緊接在revert1后面。
問題來了,rebase就是這個(gè)坑,使用rebase變基,相當(dāng)于把你本地的這個(gè)分支(注意和遠(yuǎn)程上的現(xiàn)在側(cè)commit_2合并的分支一個(gè)名字)再次merge一遍,但是你要注意,最新的commit是revert1,是摘除這個(gè)分支的merge請求,會導(dǎo)致你無論rebase多少次,這個(gè)commit_2的代碼都不會出現(xiàn),被revert1抵消掉了,而且會使得你本地的這個(gè)分支也被rebase掉,還需要git reflog&git reset --hard HEAD@{i}恢復(fù)。
解決方法:
方法1:負(fù)負(fù)得正(推薦)
既然revert剔除了我的commit_2提交,那我再revert這次revert,負(fù)負(fù)得正不就行了?確實(shí)有效。
這里注意要找對那個(gè)revert的commit_id
git revert revert1 #注意,還是有可能沖突的,有沖突要解決然后add就不重復(fù)了
執(zhí)行成功后最終本地的commit日志如下,這里commit2的代碼也恢復(fù)了,隨后在push,merge到remote即可
方法2:新建分支重新提交(不推薦)
這個(gè)方法我其實(shí)不想寫,但是也是寫到rebase坑的時(shí)候想到的,新建一個(gè)不同名的分支,在commit_2代碼量不大的情況下,重新拷貝到新分支上,然后重新提交,merge,這樣繞過了revert1的限制,本質(zhì)上這個(gè)方法就是重寫。
二:工作中的實(shí)際操作(針對場景2)
以下數(shù)據(jù)已經(jīng)經(jīng)過脫敏處理。
git log #找到revert處
commit f71b258de85679d5cdad395f6d8ac675f9817a1a
Author: leel
Date: Wed Nov 9 17:39:13 2022 +0800
add version 1.0.0
commit 395b7f8fd8b29eefd25e41358f23a71f7ab93184 <------------------這里是上次revert的id
Author: liming
Date: Wed Nov 9 17:27:34 2022 +0800
Revert "update rules"
This reverts commit 215d734c866ed8adb88e8c33ed6fe624d349a9a8.
commit 23734eb14c7feb19716b6a9aa9fb7aa4c9d4b5f4
Merge: b866e32 246894a
Author: xiaohong
Date: Tue Nov 8 11:14:24 2022 +0800
extended api verification common
commit 246894a619ad61c58dce1a8140196eaabc7e82ca
Author: xiaohong
Date: Tue Nov 1 17:43:37 2022 +0800
extended api verification common
$ git revert 395b7f8fd8b29eefd25e41358f23a71f7ab93184
[cancel_revert_update_rules 4a2b079] Revert "Revert "update rules""
5 files changed, 78 insertions(+), 57 deletions(-)
發(fā)現(xiàn)沒沖突,而且git log已更新文章來源:http://www.zghlxwxcb.cn/news/detail-779542.html
$ git log
commit 4a2b0796190aa950ab8b9b75367ff80fbb3cd43d
Author: leel
Date: Thu Dec 22 12:22:30 2022 +0800
Revert "Revert "update rules"" <--------------------------更新了revert revert 即負(fù)負(fù)得正
This reverts commit 395b7f8fd8b29eefd25e41358f23a71f7ab93184.
commit b6abc418f808cfcddee25e163299195b9ebde440
Merge: b2dee9d bf1b916
Author: xiaohong
Date: Wed Dec 21 10:26:54 2022 +0800
remove side
然后就是常規(guī)的git commit -m&git push 略文章來源地址http://www.zghlxwxcb.cn/news/detail-779542.html
到了這里,關(guān)于git revert以及revert的恢復(fù)的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!