Git Revert Revert!
一、前言
最近在工作中遇到个很有趣,让人费解的一个操作,举例子说明。
- 有两个分支,一个分支 A,一个分支 B,他们两个要合并在一起后,跟分支 C 合并,一通操作下来合并好之后,在 commit 记录中也可以看到两个分支的提交,然后提测,被告知分支 A 的功能没有实现,当时很费解,最后排查下来,发现在提测分支 C 中,没有分支 A 的代码,且无论你怎么 merge 分支 A,永远都是无任何修改。
- 当时有点不明所以,接着排查,发现在提测分支 C 中,有个操作为 Revery 分支 A 的提交记录,会不会和这个有关呢?将这个现象告知公司大佬后,由于时间比较紧张且分支 A 的代码没有多少,就手动将分支 A 的代码 copy 到了提测分支 C 中让测试人员继续。
- 之后在公司大佬研究后给出了个答案,大概问题出现原因为,提测分支 C 中的 git 提交线只要存在针对于某次 merge 的 revert 操作,就会一直忽略掉这个 merge 里包含的提交内容。
- 如果对这句话不太了解的话,咱们用通俗的话来讲就是,你撤回了这个分支上的某次提交,git 就会认为你不需要这一段代码,所以你想要把代码在合并上去,是不行的,因为他们的 commit 记录是一致的,所以会被告知两个分支是一致的。
- 至于怎么解决这个问题,就是标题所述,Revert Revert,将你 Revert 的那次记录,重新执行一遍 revert 操作,原先找不到的代码就会自动回到原分支上。
二、实验
-
我们先创建一个示例仓库进行 init 操作;
-
init 操作后我们得到了一个新的分支 develop
-
接下里我们在这个分支中做一些操作,然后合并到 master 中。
-
接着我们去 revert 这次合并
-
从上述图中已经看到了 master 分支已经 revert 了这条记录,然后我们在重新 merge 一下。
在这个分支中时可以看到还有 1.txt 存在的
在 master 中已经 revert 了,然后去 merge,被告知两个分支是一致的 -
接着我们重新 Revert Revert 操作,会发现上次 1.txt 回来了。
三、总结
基本上来说就是上述中 3、4、5 中提及的现象,大家可以实验一下。