记一次代码合并后发生错误的定位过程
昨天晚上合并完新的代码准备提交上去但是 CI 跑不了,有一个单元测试报错。然后照着官方的 git-bisect 文档找问题。这个工具比想象中要好用很多,大部分时间都花在了构建项目上面(每次修改 HEAD 之后都要重新构建才能测试)。半个小时后锁定了问题在一个具体的提交上。
接下来我需要将我的代码和这部分有问题的代码分离。我的分支是 main,远程的分支是 origin/develop,有错误的分支是 origin2/develop。因为 main 合并了一部分 origin2/develop 的代码才导致了错误。分支的结构是这样的:
* --(若干次提交)-- origin/develop --(若干次提交)-- main
\ / (若干次提交,非线性,想要舍弃掉)
--- origin2/develop -------------------------
因为我要保证 origin/develop 这个我们的仓库总是 fast-forward 合并,所以我先以这个分支为基准创建新的本地分支。然后将在 main 中(有我的新代码)、不在 next 中(因为我本来就在 next 的位置上)、不在 origin2/develop 中(有错误)的提交重播。
git checkout -b next origin/develop
git cherry-pick main ^next ^origin2/develop
因为没有加 -m
参数,所以遇到 merge 结点的时候会出错,我直接忽略掉这些 merge 结点一路 git cherry-pick --continue
了。因为这些 merge 结点全都是因为合并 origin2/develop 才产生的。(而且加 -m
参数的话,好几个 merge 结点的 parents 不同,是不是要分段一个一个重播呢?我这里不需要任何 merge 结点,所以就没这样操作。)