Git 二分調試法,火速定位疑難Bug!

你必定遇到過,一個好久沒修改過的功能,莫名其妙的出現了問題?肉眼查代碼、屢邏輯徹底找不到問題點?前兩天還好好的功能,怎麼這個今天就不行了?這兩天改動了這麼多代碼,究竟是那一次改動引起的 Bug?git

這樣非崩潰的 Bug,有時候想要排查出問題,並非一件容易的事情。我想,這個時候你會須要 git bisect !算法

1、git bisect 基礎使用

git bisect 是 Git 提供的一種 二分法 的調試工具,它能夠按照咱們選定的提交,進行二分分割,快速定位出出錯的提交。來幫咱們縮小最小改動的代碼,從而快速定位問題。設計模式

git bisect 其實很簡單,主要是基於幾個基本命令:工具

  • git bisect start:準備進行 bisect debug。
  • git bisect good:標記一個提交爲 "good"。
  • git bisect bad:標記一個提交爲 「bad」。
  • git bisect reset:退出 bisect debug 的狀態。

git bisect 涉及到的命令,很是的清晰簡單,下面舉個實際的例子,結合上面的解釋,就更清晰了。學習

2、git bisect 工做流

我本身生造出 6 個 commit,而後使用 git log 看看個人提交記錄。測試

gitlog

這裏假設我正常開發的階段,到 v6 提交的時候,忽然發現有個 Bug ,沒法定位到問題,可是能明確的知道,在 v1 提交階段,並無這個 Bug。spa

那麼,在這樣的狀況下,v6 就是一個有問題的版本,而 v1 則是一個好的版本,咱們就能夠藉助 git bisect 來進行二分超找定位問題來自哪一個提交。debug

還記得剛纔的命令嗎?設計

咱們先用 git bisect start 標記開始 bisect debug ,而後使用 git bisect goodgit bisect bad 分別標記出正確的和錯誤的提交。3d

biscet-start

每一個提交,都有一個針對這個提交惟一的 SHA-1 值,由於太長不方便輸入和閱讀,這裏能夠直接使用前幾位做爲簡寫。

當標記處正確的和錯誤的提交以後,git bisect 馬上就能夠幫咱們定位出中間提交 v3

如今 HEAD 就已經指向了 v3 提交的代碼了,這個可使用 git status 查看當前的狀態。

git-status

因此咱們能夠基於 v3 版本的代碼,直接運行項目,測試看該提交是否有問題。

通過測試以後,發現 v3 的提交代碼版本,並無復現 Bug,那咱們就能夠縮小錯誤提交的範圍,大概落在了 v4v5v6 之間。

此時,咱們只須要使用 git good 標記 v3 版本是正確的。

bisect-good-v3

標記好 v3good 以後,馬上又會進行一次二分,這次標記的爲中間提交 v5

通過對 v5 提交的版本代碼,進行測試以後發現,它是有問題的。咱們繼續使用 git bisect bad 對它進行標記。

bisect-bad-v4

v5 有問題的時候,如今只中間一個 v4 版本,因此會馬上指向 v4 提交。

咱們繼續對 v4 版本的代碼進行測試,發現 v4 版本也有問題,繼續標記它爲 bad

bisect-bad

此時就很明確了,出錯的提交就是 v4,而 Git 也直接幫咱們指出來出錯的提交。

雖然這裏定位到,出錯的提交就是 v4 的問題,咱們只須要仔細閱讀 v4 提交的代碼,而後定位出問題代碼,就達到了咱們的目的。可是咱們並不該該在 v4 提交上直接修改 Bug,咱們應該退出 bisect debug 狀態,在最新的提交版本上進行修改,這裏使用 git bisect reset 退出,再進行修改便可。

到這裏,就是 git bisect 的完整工做流程。

3、bisect的後悔藥

對提交進行 goodbad 的標記,都是人爲來進行的,不免有出錯的狀況。而提交比較少的時候,大不了就是 reset 以後,重頭來過。

可是若是有幾十個提交,再從頭進行一次 bisect 就比較麻煩了。Git 考慮到這一點,已經爲咱們配好了後悔藥。

想要擦除以前的標記狀態,就涉及到一個命令:

  • git bisect replay:重置到某個狀態。

replay 須要制定一個回退的點,這個點是須要使用 git bisect log > log.txt 輸出的 Log 文件, 咱們須要經過修改這個 Log 文件,來肯定回退的點。

舉個例子,咱們使用 log 命令,輸出一個 log.txt 文件。

log

能夠看到,這個 log.txt 文件,記錄了咱們剛纔全部的操做。

在這個例子中,假如咱們的操做,對 v5 進行 bad 的這個標記錯了,那麼,咱們把這個操做之下的 Log 所有刪除掉,而後執行 git bisect replay log.txt

replay

這樣就將回退到判斷 v5 提交好壞的地方,從新進行標記。

在修改 Log.txt 文件的時候,最好只執行刪除操做,不要對其中的順序有所修改,畢竟咱們只是想要一個回滾的動做,並非要改動咱們以前的某些操做。

今天在 承香墨影公衆號的後臺,回覆『 成長』。我會送你一些我整理的學習資料,包含:Android反編譯、算法、設計模式、虛擬機、Linux、Kotlin、Python、爬蟲、Web項目源碼。

推薦閱讀:

相關文章
相關標籤/搜索