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,从简单场景说起
假设在上面的场景中没有小王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
如下图:
简化图如下:
3,回到复杂的场景
理解了简单场景,复杂的场景只不过细心点就可以解决了,再看文中开头提到的场景:
思路如下:
- Step 1:revert掉m5提交,会生成m7提交,达到master分支去除dev1分支的所有修改。
- Step 2:切到dev1分支上修改,进行bug修改,在dev1分支上生成c5。
- Step 3:切到master分支上,对m7进行反向revert生成 m8 提交。
- Step4:合并dev1分支,即可达到修复dev1分支上bug的问题。
上面的整体实战示例如下图(图中为了简便,只进行了dev分支c1和c2提交):