1. 背景
描述一個git revert使用場景,加深一下對git revert的使用,場景如下:
- Step 1:小輝在分支dev1上開發,提交了4次(分別爲c1、c2、c3、c4),發佈時需要把dev1分支合併到master分支上,生成了提交記錄m5,併發布到線上。
- Step 2: 小王在分支dev2上開發,提交了1次(c3),然後也把dev2分支合併到master分支上,生成了提交記錄m6,併發布到線上。
- Step 3: 不幸的是,小輝的dev1分支上存在bug,需要回滾dev1上的所有提交。
2. 解決思路
2.1 從簡單場景說起
假設在上面的場景中沒有小王dev2的提交,即把上面的場景簡單化(如下圖),流程如下:
- Step 1:小輝在分支dev1上開發,提交了4次(分別爲c1、c2、c3、c4),發佈時需要把dev1分支合併到master分支上,合併的時候採用的是禁止快進式合併,即執行命令
git merge --no-ff dev1
生成了提交記錄m5,併發布到線上。 - Step 2: 不幸的是,小輝的dev1分支上存在bug,需要回滾dev1上的所有提交。
切到master分支上,使用git log --graph看出:
這裏可以採用命令 git revert -m 1 77cb206f6b5db591a43eb55899b84f161656694f
,即保留master主分支(1代表保留master主分支,revert掉另外一個分支的提交),revert完成後再看log會生成一個revert提交m6,如下圖:
簡化圖如下:
上面進行了分支的成功回滾,但帶來一個問題,若小輝在dev1分支上修復完bug後在再提交生成了c5,此時再去合併到master分支,之前c1到c4次提交會消失,而只有c5的提交,此時應該怎麼辦?此時切到master分支,再對m6提交進行反向revert一次就會找到c1~c4次提交,此時再進行dev1合併就可以了,命令如下:
git checkout master
git revert 11e7d194b73f6276ad07ee56502e98b6dbfe357e 反向revert
git merge --no-ff dev1 合併dev1
git push origin master
圖如下:
2.2 回到上面複雜的場景
理解了簡單場景,複雜的場景只不過細心點就可以解決了,再看文中開頭提到的場景:
思路如下:
- Step 1:revert掉m5提交,會生成m7提交,達到master分支去除dev1分支的所有修改。
- Step 2:切到dev1分支上修改,進行bug修改,在dev1分支上生成c5。
- Step 3:切到master分支上,對m7進行反向revert生成m8提交,再合併dev1分支,即可達到修復dev1分支上bug的問題。
上面的整體實戰示例如下圖(圖中爲了簡便,只進行了dev分支c1和c2提交):