将 git 平分在祖先路径上

yai*_*chu 5 git git-bisect

我有一个带有复杂的分支和合并树的存储库,我想使用 git bisect 来查找引入错误的时间。

我有一个好的提交和坏的提交来开始二等分,其中好的提交是坏提交的祖先。

我希望git bisect提交具有良好提交作为祖先的提交,但它没有(使用 git 2.21.0)。

目前,我通过保留提交列表并git rev-list --ancestry-path GOOD..BAD在中间使用和选择提交来手动进行二等分。有没有办法让这个自动化git bisect?它是否有旗帜可以留在祖先的道路上?

首先在祖先路径中一分为二的推理

与正在搜索的错误相关的功能可能并非在所有分支中都存在,因此检查在那里无关紧要。不过,它们应该存在于祖先路径中。

一旦完成了对祖先路径的二等分,一个人可能会得到一个合并提交作为罪魁祸首,他们就会知道这个错误来自那个分支。这已经教会了人们很多关于这个错误的知识。

为了继续对引入 bug 的分支进行二等分,不需要单独测试每个提交(因为它们不一定具有使 bug 出现所需的特性),但应该将每个提交与最后一个好的提交合并然后检查错误是否存在。然后可以查明特定的提交,当与好的提交合并时,会引入错误。

请注意,我已经多次执行此过程,它对我非常有用,我只是在寻找使其更方便的方法。

bk2*_*204 2

git bisect没有选择追随祖先的道路。由于以下几个原因,这样的选项通常没有用:

  • 大多数情况下,用户无法确定回归是在哪里引入的。因此,不太可能使用复杂的选项来控制路径遍历。
  • 在大多数情况下,您将省略大量可能的分支,因为您将跳过它们。如果您有 1024 个单独的分支,其中一个提交合并到您的master分支中,git bisect则在第一次测试后甚至会忽略其中的一半,并且仍然只需要运行 12 次即可找到有问题的提交。
  • 通常,有问题的提交位于合并分支上,而不是在祖先路径上。对于没有线性历史记录(即基于合并的工作流程)的大多数情况都是如此。

除非您对存储库有具体的了解,以至于不在祖先路径上的提交会产生误报或漏报,否则通常就可以让它git rebase做它的事情。由于其行为复杂度为 O(log N),因此额外成本往往可以忽略不计。但是,如果需要,您可以git bisect skip RANGE指定要跳过的范围。

如果您可以使用 shell 脚本或命令自动测试分支,则可以git bisect run与该 shell 脚本一起使用。如果提交良好,则应退出 0;如果应跳过提交,则应退出 125;如果提交不好,则应退出 1 到 127(包括 1 和 127)之间的任何其他代码。这可以用来避免检查由于任何原因不适合的提交。