为何git bisect返回了远早于指定好坏提交范围的旧提交?
git bisect返回指定范围外旧提交的原因及解决方法
根因说明
git bisect的查找逻辑不基于提交日期筛选,而是基于提交的有向无环图依赖关系遍历:
- 你指定的好提交
7ce16e99296de1d559e7317adac6bc13a727ae2b和坏提交8acb2b2ed0eb1576e7961149bde27cb1568ec39e之间存在跨分支合并场景:坏提交所在的分支历史中,合入了一条未被包含在好提交历史链中的旧分支。 - 返回的2020年12月的
2f3971bcae715839ee8d2aea837a4bf4ce31c815就是这条被合入的旧分支上的节点,git bisect判定该提交属于两个目标提交的共同祖先校验范围,因此会返回供你校验。
解决方法
- 方案1:添加
--first-parent参数启动bisect
该参数会让bisect仅沿着当前分支的首个父提交遍历,完全忽略合并进来的其他分支的提交历史,仅在当前分支的线性提交序列中查找问题,符合你预期的时间范围筛选逻辑,命令如下:
适合确认问题出在当前分支的直接提交、而非合并引入的场景。git bisect start --first-parent git bisect good 7ce16e99296de1d559e7317adac6bc13a727ae2b git bisect bad 8acb2b2ed0eb1576e7961149bde27cb1568ec39e - 方案2:正常标记跨分支提交的状态
如果你无法确定问题是否由合并的旧分支引入,直接校验返回的2f3971bcae715839ee8d2aea837a4bf4ce31c815提交即可:验证后如果是好的执行git bisect good,是坏的执行git bisect bad,bisect会自动收缩查找范围,不会影响最终定位结果,仅会多1-2步校验步骤。 - 方案3:更换好提交的节点
你可以选择一个同时包含所有合并分支历史、和坏提交同属一条主分支链的提交作为好提交,bisect遍历的时候就不会跳出你预期的时间范围。
内容的提问来源于stack exchange,提问作者calvin
相关产品推荐
相关产品推荐

