使用 Git bisect 命令定位首次引入錯(cuò)誤的提交

你是不是有過這樣的經(jīng)歷:發(fā)現(xiàn)代碼中有 錯(cuò)誤bug,但不知道這個(gè)錯(cuò)誤是什么時(shí)候引入的。這有可能是因?yàn)?,某個(gè)人提交了一份有錯(cuò)誤的代碼,但沒有在他的 Git 提交commit 消息中聲明它。這個(gè)錯(cuò)誤可能已經(jīng)存在了幾周、幾個(gè)月甚至幾年,這意味著你需要搜索數(shù)百或數(shù)千個(gè)提交,才能找到問題何時(shí)出現(xiàn)的。而 ??git bisect?? 命令能夠完美地解決這個(gè)問題!
??git bisect?? 命令是一個(gè)強(qiáng)大的工具。你可以給 ??git bisect?? 命令一個(gè)范圍,一端是一個(gè)已知的好狀態(tài),另一端是一個(gè)已知的壞狀態(tài)。它會(huì)自動(dòng)地確認(rèn)當(dāng)前范圍的中點(diǎn),在這個(gè)中點(diǎn)上進(jìn)行測試,然后要求你確定那次提交是一個(gè) 好提交good commit 還是一個(gè) 壞提交bad commit,然后它會(huì)重復(fù)這一“二分查找”的過程,直到你找到首次引入錯(cuò)誤的那一次提交。

Image of Zeno's paradox of Achilles.
這個(gè)“數(shù)學(xué)”工具是利用“二分查找”來找到錯(cuò)誤之處的。??git bisect?? 命令通過查看中點(diǎn),然后由你來決定它是提交列表的新起點(diǎn)(即 “壞提交” )還是新終點(diǎn)(即 “好提交”),進(jìn)而來縮小查找范圍,如此在幾次查找中你可以就能定位到有錯(cuò)誤的提交。即使你有 10,000 個(gè)提交要檢查,最多只需要 13 次查找,就能很快地定位到首次引入錯(cuò)誤的提交。
- 提交 1 壞 <> 提交 10,000 好 => 提交 5,000 是壞的
- 提交 5,000 壞 <> 提交 10,000 好 => 提交 7,500 是好的
- 提交 5,000 壞 <> 提交 7,500 好 => 提交 6,250 是好的
- 提交 5,000 壞 <> 提交 6,250 好 => 提交 5,625 是壞的
- 提交 5,625 壞 <> 提交 6,250 好 => 提交 5,938 是壞的
- 提交 5,938 壞 <> 提交 6,250 好 => 提交 6,094 是好的
- 提交 5,938 壞 <> 提交 6,094 好 => 提交 6,016 是壞的
- 提交 6,016 壞 <> 提交 6,094 好 => 提交 6,055 是好的
- 提交 6,016 壞 <> 提交 6,055 好 => 提交 6,036 是壞的
- 提交 6,036 壞 <> 提交 6,055 好 => 提交 6,046 是壞的
- 提交 6,046 壞 <> 提交 6,055 好 => 提交 6,050 是壞的
- 提交 6,050 壞 <> 提交 6,055 好 => 提交 6,053 是好的
- 提交 6,053 壞 <> 提交 6,055 好 => 提交 6,054 是好的
對于上面這個(gè)例子,我們能知道 10,000 個(gè)提交中的第一個(gè)錯(cuò)誤提交是第 6053 次提交。對于 ??git bisect?? 命令,最多需要幾分鐘就能完成檢索。但是如果要一個(gè)一個(gè)查找每個(gè)提交是否錯(cuò)誤,我甚至無法想象需要多長時(shí)間。
使用 Git bisect 命令
??git bisect?? 命令使用起來非常簡單:
(LCTT 譯注:使用 ??git bisect start?? 命令來進(jìn)入 bisect 模式,并且該命令指定了一個(gè)檢查范圍。它會(huì)告訴我們一共有多少次提交,大概需要幾步就可以定位到具體的提交。)
Git 檢查中間的提交,并等待你聲明這次提交是一個(gè)好提交還是一個(gè)壞提交:
(LCTT 譯注:如果某一提交是可以通過的,則使用 ??git bisect good?? 命令標(biāo)記;同樣地,如果某一提交不能通過,則使用 ??git bisect bad?? 命令標(biāo)記。)
或
然后,??git bisect?? 工具重復(fù)檢查好提交和壞提交中間的那次提交,直到你告訴它:
一些高級用戶甚至可以自己編寫腳本,來確定提交的好壞狀態(tài)、并在找到特定提交時(shí)采取某一補(bǔ)救措施。你可能不會(huì)每天都使用 ??git bisect?? 命令,但當(dāng)你需要它來定位首次引入錯(cuò)誤的提交時(shí),它會(huì)是一個(gè)很有用的救星。



























