一:背景与方案
在工作中遇见的这样的场景:
场景一:
已经merge到待发布的版本分支中的功能需要移除当前的分支,改在后续版本发布,示意图如下,展示的是commit序列,
这里想要移除的功能是commit_2的,所以需要在不改动其他commit相对顺序前提下,将这个‘瘤’取下,因此这里就绝对不推荐git reset的方式,因为如果commit_2在末尾可以,如果不在末尾,将导致commit_2后的提交都被清空,这里要使用git revert的方式,像链表从中间删除元素一样,保持其他提交的顺序。
git checkout -b revert_commit origin/master #从远程分支上创建本地的revert分支
git revert commit_2 #注意这里commit_2是指定的提交id,注意这步可能会冲突,因为有可能其他人在你这个提交基础上做了工作,要解决冲突
git add . #这一步用来解决冲突后添加文件到暂存区,没有冲突不需要
git commit -m 'revert commmit_2' #设置revert的提交信息
git push origin revert_commit:revert_commit #上传本地的revert分支
git merge revert_commmit master #分支合并
场景二:
上一个版本已经定了,如下的commit顺序,这里commit_2是虚线表示记录还在,但是代码不在,可以理解为commit_2是一个加法,revert1是针对commit_2的一个减法。
问题来了,当前master分支上是如上图所示的提交日志,现在新版本又需要这个commit_2的代码了,这里注意有一个坑的方法,我们也先说坑。
很多人觉得无所谓,我本地更新最新的master分支代码,恰好我之前写的commit_2本地还有分支,我直接rebase一下不就可以了吗?而且应该会生成一个新的commit_5紧接在revert1后面。
问题来了,rebase就是这个坑,使用rebase变基,相当于把你本地的这个分支(注意和远程上的现在侧commit_2合并的分支一个名字)再次merge一遍,但是你要注意,最新的commit是revert1,是摘除这个分支的merge请求,会导致你无论rebase多少次,这个commit_2的代码都不会出现,被revert1抵消掉了,而且会使得你本地的这个分支也被rebase掉,还需要git reflog&git reset --hard HEAD@{i}恢复。
解决方法:
方法1:负负得正(推荐)
既然revert剔除了我的commit_2提交,那我再revert这次revert,负负得正不就行了?确实有效。
这里注意要找对那个revert的commit_id
git revert revert1 #注意,还是有可能冲突的,有冲突要解决然后add就不重复了
执行成功后最终本地的commit日志如下,这里commit2的代码也恢复了,随后在push,merge到remote即可
方法2:新建分支重新提交(不推荐)
这个方法我其实不想写,但是也是写到rebase坑的时候想到的,新建一个不同名的分支,在commit_2代码量不大的情况下,重新拷贝到新分支上,然后重新提交,merge,这样绕过了revert1的限制,本质上这个方法就是重写。
二:工作中的实际操作(针对场景2)
以下数据已经经过脱敏处理。
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(-)
发现没冲突,而且git log已更新
$ git log
commit 4a2b0796190aa950ab8b9b75367ff80fbb3cd43d
Author: leel
Date: Thu Dec 22 12:22:30 2022 +0800
Revert "Revert "update rules"" <--------------------------更新了revert revert 即负负得正
This reverts commit 395b7f8fd8b29eefd25e41358f23a71f7ab93184.
commit b6abc418f808cfcddee25e163299195b9ebde440
Merge: b2dee9d bf1b916
Author: xiaohong
Date: Wed Dec 21 10:26:54 2022 +0800
remove side
然后就是常规的git commit -m&git push 略