2016-04-08 29 views
7

當使用git bisect時,可以運行git bisect skip來將當前提交標記爲不可構建/不可測試的,以嘗試讓Git選擇其他提交來測試。git bisect skip如何選擇下一個提交嘗試?

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 
+0

您是否閱讀過文檔?我說它使用二進制搜索。 https://git-scm.com/docs/git-bisect – crashmstr

+2

@crashmstr你呢?子命令* skip *的確很不明確。 –

+2

@crashmstr:我知道'git bisect'的基本用法是二分查找。但'git bisect skip'不能只是一個二進制搜索,因爲這不是一個二進制搜索_does_。是的,我已經瀏覽了文檔,甚至在問這裏之前開始嘗試查看源代碼,並且我找不到解釋如何在選擇「git bisect skip」之後進行下一次提交的任何地方。 –

回答

9

我做了一些挖掘到Git的源代碼,發現大多數答案的自己...

正如吉特V1.6的。4(具體來說,從commit ebc9529f開始),Git使用「帶有偏倚的PRNG(僞隨機數生成器)」來確定在跳過一個之後接下來要嘗試的提交。

我不能說我是按算法本身(因爲它是首次加入v2.8.1的這似乎是根本不變),但提交信息做了解釋的合理的工作是怎麼回事:

平分:跳過從不可測遠時犯

使用PRNG(僞隨機數發生器)以偏置應該比3固定比之間交替更好 使用PRNG用偏置。

在包含許多不可測試提交的存儲庫中,應該防止在許多提交不可測試的區域之間交替使用 。偏見應該傾向於 提交,可以提供更多的信息,所以平分過程 不應該失去很多效率。

HPA建議使用PRNG,並發現最佳偏差是將PRNG給出的0到1之間的比率提高到功率1.5。

所以它看起來好像Git選擇隨機嘗試下一次提交,但隨機分佈被選中(希望)選擇提交二進制搜索的更多信息的提交,並避免提交可能在區域不可測試的提交。

-4

正如它的名字Git的建議,簡單的答案是:這是你的非的businness的。

背後git bisect的想法是,你指定兩個端點和Git算起來提交,在兩者之間,即它認爲是降低測試的數量目標的有益的。

由於文件說,這僅僅是一個二進制搜索,但沒有規定什麼樣的算法用於

然後混帳開張挑選這兩個端點之間的承諾

它可能不是一個簡單的挑選中間提交二進制搜索,Git可能會採用任何它想要的決策算法,它明確不希望你知道它,所以你不會對將被挑選的提交做出假設向上。

當談到改變拿起提交它給你兩種可能性:

  1. 你手動選擇新的提交。例如git reset --hard
  2. 你告訴Git做出一個新的選擇,git bisect skip

在後一種情況下,例如當您使用goodbad更新端點時,決定由Git根據需要進行。


出於好奇,我做了簡單的單支庫,並試圖git bisect skip命令。
我的Git版本拿起了以前的提交。

+7

這當然不是我需要知道的使用該工具的東西,但我不同意開源項目的工作原理是「我的業務無關」;如果是這樣的話,它不會是開源的。我試圖在這裏發現我的好奇心,希望有人能夠知道答案,而不是需要我去挖掘源代碼本身。 –