git bisect如何跳过选择下一次提交尝试?

时间:2016-04-08 10:58:46

标签: git git-bisect

使用git bisect时,可以运行git bisect skip将当前提交标记为unbuildable / untestable,以尝试让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

1 个答案:

答案 0 :(得分:-7)

正如Git所建议的那样,简短的回答是:它不是你的业务

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

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

  

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

它可能不是一个简单的 pick-the-middle-commit 二进制搜索,Git可以使用它想要的任何决策算法,它明确地不希望你知道它以便你不会对将被提取的提交做出假设。

当涉及到更改提取的提交时,它为您提供了两种可能性:

  1. 您手动选择新提交。例如git reset --hard
  2. 你告诉Git用git bisect skip做出新的选择。
  3. 在后一种情况下,当您使用goodbad更新端点时,Git会以其想要的方式做出决定。

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