你一定遇到過,乙個很久沒修改過的功能,莫名其妙的出現了問題?肉眼查**、屢邏輯完全找不到問題點?前兩天還好好的功能,怎麼這個今天就不行了?這兩天改動了這麼多**,到底是那一次改動引發的 bug?
這樣非崩潰的 bug,有時候想要排查出問題,並不是一件容易的事情。我想,這個時候你會需要 git bisect !
git bisect 是 git 提供的一種二分法的除錯工具,它可以按照我們選定的提交,進行二分分割,快速定位出出錯的提交。來幫我們縮小最小改動的**,從而快速定位問題。
git bisect 其實很簡單,主要是基於幾個基本命令:
git bisect 涉及到的命令,非常的清晰簡單,下面舉個實際的例子,結合上面的解釋,就更清晰了。
我自己生造出 6 個 commit,然後使用git log
看看我的提交記錄。
這裡假設我正常開發的階段,到v6提交的時候,突然發現有個 bug ,無法定位到問題,但是能明確的知道,在v1提交階段,並沒有這個 bug。
那麼,在這樣的情況下,v6就是乙個有問題的版本,而v1則是乙個好的版本,我們就可以借助git bisect
來進行二分超找定位問題來自哪個提交。
還記得剛才的命令嗎?
我們先用git bisect start
標記開始bisect debug,然後使用git bisect good
和git bisect bad
分別標記出正確的和錯誤的提交。
每個提交,都有乙個針對這個提交唯一的sha-1值,因為太長不方便輸入和閱讀,這裡可以直接使用前幾位作為簡寫。
當標記處正確的和錯誤的提交之後,git bisect
立刻就可以幫我們定位出中間提交v3。
現在head就已經指向了v3提交的**了,這個可以使用git status
檢視當前的狀態。
所以我們可以基於v3版本的**,直接執行專案,測試看該提交是否有問題。
經過測試之後,發現v3的提交**版本,並沒有復現 bug,那我們就可以縮小錯誤提交的範圍,大概落在了v4、v5、v6之間。
此時,我們只需要使用git good
標記v3版本是正確的。
標記好v3為good之後,立刻又會進行一次二分,此次標記的為中間提交v5。
經過對v5提交的版本**,進行測試之後發現,它是有問題的。我們繼續使用git bisect bad
對它進行標記。
當v5有問題的時候,現在只中間乙個v4版本,所以會立刻指向v4提交。
我們繼續對v4版本的**進行測試,發現v4版本也有問題,繼續標記它為bad。
此時就很明確了,出錯的提交就是v4,而 git 也直接幫我們指出來出錯的提交。
雖然這裡定位到,出錯的提交就是v4的問題,我們只需要仔細閱讀v4提交的**,然後定位出問題**,就達到了我們的目的。但是我們並不應該在v4提交上直接修改 bug,我們應該退出 bisect debug 狀態,在最新的提交版本上進行修改,這裡使用git bisect reset
退出,再進行修改即可。
到這裡,就是git bisect
的完整工作流程。
對提交進行good和bad的標記,都是人為來進行的,難免有出錯的情況。而提交比較少的時候,大不了就是 reset 之後,重頭來過。
但是如果有幾十個提交,再從頭進行一次 bisect 就比較麻煩了。git 考慮到這一點,已經為我們配好了後悔藥。
想要擦除之前的標記狀態,就涉及到乙個命令:
replay 需要制定乙個回退的點,這個點是需要使用git bisect log > log.txt
輸出的 log 檔案, 我們需要通過修改這個 log 檔案,來確定回退的點。
舉個例子,我們使用 log 命令,輸出乙個log.txt檔案。
可以看到,這個 log.txt 檔案,記錄了我們剛才所有的操作。
在這個例子中,假如我們的操作,對v5進行bad的這個標記錯了,那麼,我們把這個操作之下的 log 全部刪除掉,然後執行git bisect replay log.txt
。
這樣就將回退到判斷v5提交好壞的地方,重新進行標記。
在修改 log.txt 檔案的時候,最好只執行刪除操作,不要對其中的順序有所修改,畢竟我們只是想要乙個回滾的動作,並不是要改動我們之前的某些操作。
今天在推薦閱讀:
Git 二分除錯法,火速定位疑難Bug!
你一定遇到過,乙個很久沒修改過的功能,莫名其妙的出現了問題?肉眼查 屢邏輯完全找不到問題點?前兩天還好好的功能,怎麼這個今天就不行了?這兩天改動了這麼多 到底是那一次改動引發的 bug?這樣非崩潰的 bug,有時候想要排查出問題,並不是一件容易的事情。我想,這個時候你會需要 git bisect g...
Git 二分除錯法,火速定位疑難Bug!
你一定遇到過,乙個很久沒修改過的功能,莫名其妙的出現了問題?肉眼查 屢邏輯完全找不到問題點?前兩天還好好的功能,怎麼這個今天就不行了?這兩天改動了這麼多 到底是那一次改動引發的 bug?這樣非崩潰的 bug,有時候想要排查出問題,並不是一件容易的事情。我想,這個時候你會需要 git bisect g...
Git 二分除錯法,火速定位疑難Bug!
你一定遇到過,乙個很久沒修改過的功能,莫名其妙的出現了問題?肉眼查 屢邏輯完全找不到問題點?前兩天還好好的功能,怎麼這個今天就不行了?這兩天改動了這麼多 到底是那一次改動引發的 bug?這樣非崩潰的 bug,有時候想要排查出問題,並不是一件容易的事情。我想,這個時候你會需要 git bisect g...