⚠️ 它俩和 merge --abort 差在哪
和上一条路线的 merge --abort 相比,revert / reset 【0】。
revert 之后历史多长
把第 4 次提交(加上除法,也就是引入 bug 那次)revert 掉。运行下面这段程序: def revert(hist, target): """造一个反向提交接在最后,原来那次一个都不动"
reset 之后呢
换成 reset 回到第 3 次提交(加上减法)。运行下面这段程序: def reset(hist, target): """把指针挪回去,之后的提交不再可达"""
写一个 revert
补全 revert(hist, target):在历史末尾追加一次反向提交,原来那次一个都不动。 输出 revert 之后的历史长度。
写一个 reset
补全 reset(hist, target):把历史截断到 target 那一次为止(包含它)。 输出 reset 到第 3 次之后的长度。
⚠️ 两种撤销,历史一长一短
对同一段历史各做一次:revert 掉第 4 次、reset 回第 3 次。 两个长度拼起来输出(revert 在前)。
bisect 靠的是什么前提
用二分法找引入 bug 的提交,前提是【0】。
二分每一步在做什么
bisect 的每一步是【0】。
⚠️ 二分找到的是哪一次
bisect 最终指出的那次提交是【0】。
二分实际测了几次
七次提交,第 1 次是好的、第 7 次是坏的,bug 从第 4 次开始出现。运行下面这段程序: def bisect(ids, is_bad): good = 0 bad = len(ids) - 1 tried =