【问题标题】:How does git bisect skip choose the next commit to try?git bisect skip 如何选择下一个提交尝试?
【发布时间】:2016-07-29 14:51:27
【问题描述】:

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

Git 如何决定在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

【问题讨论】:

  • 您阅读文档了吗?我说它使用二进制搜索。 git-scm.com/docs/git-bisect
  • @crashmstr 是吗?子命令 skip 确实不是很清楚。
  • @crashmstr:我知道git bisect 的基本用法是二分搜索。但是git bisect skip 不能只是二分搜索,因为这不是二分搜索所做的。是的,我已经浏览了文档,甚至开始尝试查看源代码,然后再在这里提问,但我找不到任何地方解释如何选择 git bisect skip 之后的下一次提交。
  • 请注意,由于合并提交,git bisect 做了一些非常神奇的事情无论如何

标签: git git-bisect


【解决方案1】:

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

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

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

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

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

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

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

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

【解决方案2】:

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

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

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

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

这可能不是一个简单的 pick-the-middle-commit 二分搜索,Git 可能会使用它想要的任何决策算法,但它明确不希望你知道它,这样你就赢了' t 对将被拾取的提交做出假设。

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

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

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


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

【讨论】:

  • 使用该工具当然不是我需要知道的,但我不同意开源项目的工作方式“不关我的事”;如果是这样,它就不是开源的。我试图在这里满足我的好奇心,希望有人会知道答案,而不是需要我去挖掘源代码本身。
猜你喜欢
  • 2011-03-11
  • 2020-12-15
  • 2013-12-12
  • 2020-08-23
  • 1970-01-01
  • 2013-06-20
  • 2015-10-20
  • 2018-07-28
  • 1970-01-01
相关资源
最近更新 更多