31

使用 时git bisect,可以运行git bisect skip以将当前提交标记为不可构建/不可测试的提交,以尝试让 Git 选择其他提交进行测试。

Git 如何决定在 a 之后尝试哪个提交git bisect skip?实验表明它不仅仅是一个相邻的提交,但我无法计算出这种模式。

编辑:我知道基本git bisect是二进制搜索,但我很好奇git bisect skip,这显然是在做一些更复杂的事情。

实验表明它不仅仅是选择一个相邻的提交;下面创建了 100 个编号为 0-99 的提交,然后开始将它们一分为二。第一个提交git bisect选择位于中间,但之后的每个提交git bisect skip似乎或多或少是随机选择的。

$ git init
Initialized empty Git repository in .git/

$ for (( i=0; i<100; i++ )); do echo $i > file; git add file; git commit -m $i >/dev/null; done  # Create some dummy commits

$ git bisect start HEAD $(git rev-list --max-parents=0 HEAD)  # HEAD is bad, root commit is good.
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[099e5cf2ccde625f92dc369da6cad0bdf2852ce4] 49

$ git bisect skip
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[88c8208a7c4322222124167e49f07c741af7d3d8] 60

$ git bisect skip
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[04695f2e5b2473c3ac72435c0dbfc3ba1375abda] 88

$ git bisect skip
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[1e9bf3d29589bcac2d8c467245ae8d446c195252] 40

$ git bisect skip
Bisecting: 49 revisions left to test after this (roughly 6 steps)
[9459ed79e4112d674681c8f0f921127217c7ebc6] 13
4

2 回答 2

39

我对 Git 源代码进行了一些挖掘,并自己找到了大部分答案......

从 Git v1.6.4 开始(特别是从提交 ebc9529f 开始),Git 使用“带有偏差的 PRNG(伪随机数生成器)”来确定在跳过一个提交后接下来要尝试哪个提交。

我不能说我遵循算法本身(从 v2.8.1 开始,自首次添加以来似乎基本未受影响),但提交消息可以合理地解释正在发生的事情:

bisect:在跳过不可测试的提交时使用带有偏差的 PRNG

使用带有偏差的 PRNG(伪随机数生成器)应该比在 3 个固定比率之间交替使用更好。

在具有许多不可测试提交的存储库中,它应该防止在许多提交不可测试的区域之间交替。偏见应该有利于可以提供更多信息的提交,因此二分过程不应该失去太多效率。

HPA 建议使用 PRNG,并发现最佳偏差是将 PRNG 给出的 0 和 1 之间的比率提高到 1.5 次方。

所以看起来 Git 选择了下一个提交来随机尝试,但随机分布被选择(希望)选择为二进制搜索提供更多信息的提交,并避免提交可能位于不可测试的提交区域。

于 2016-04-10T00:33:03.300 回答
-16

正如 Git 的名字所暗示的那样,简短的回答是:这不关你的事

背后的想法git bisect是,您指定两个端点,Git 将其视为一个提交,在两者之间,它认为对于减少测试数量的目标是有用的。

正如文档所说,这只是一个二进制搜索,但没有指定使用哪种算法

然后 git bisect 在这两个端点之间选择一个提交

它可能不是一个简单的选择中间提交二进制搜索,Git 可能会使用它想要的任何决策算法,并且它明确不希望你知道它,这样你就不会对将被挑选的提交做出假设向上。

在更改拾取的提交时,它为您提供了两种可能性:

  1. 您手动选择新的提交。例如与git reset --hard.
  2. 你告诉 Git 做出新的选择,使用git bisect skip.

在后一种情况下,当您使用 和 更新端点时goodbad决定由 Git 以它想要的方式做出。


出于好奇,我制作了简单的单分支存储库并尝试了该git bisect skip命令。
我的 Git 版本选择了之前的提交。

于 2016-04-08T12:58:33.013 回答