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提交):