首頁 >後端開發 >Python教學 >GIT中的二分查找(GIT BISECT)

GIT中的二分查找(GIT BISECT)

高洛峰
高洛峰原創
2016-12-14 15:56:354135瀏覽

用git管理的程式碼倉庫,如果發現引入的新的bug,則可以使用 “git bisect” 來進行二分查找,從而定位是到引入bug的commit。這也特別是Linux、KVM、QEMU等開源社群中大家最常用的方法。
當有bug被fix時,也可以同樣使用”git bisect”來二分查找fix了這個bug的commit。不過,由於”git bisect”最初是用於尋找引入bug的壞點而不是fix bug的好點,故在使用”git bisect”尋找修復bug的點時,可能會遇到GIT工具有如下的錯誤提示:

[root@jay-linux qemu.git]# git bisect start
# commit-4b274b160 is newer than commit-079944e6.
[root@jay-linux qemu.git]# git bisect good 4b274b160
[root@jay-linux qemu.git]# git bisect bad 079944e6
Some good revs are not ancestor of the bad rev.
git bisect cannot work properly in this case.
Maybe you mistake good and bad revs?

遇到這種情況下,可以換一種思考方式,既然“git bisect” 僅適用於將較新的commit標記為bad,而將較舊的標記為good,那麼我們可以“將我們認為是good的點標記為bad,是bad的點標記為good”,然後找到最後的“the first bad commit”其實就似乎fix某個bug的“the first good commit”。
真的,稍微換一下思考方式就能解決這種問題了,再次體會到「think out of the box」的重要性。

下面是已qemu.git為例來示範「git bisect」的用法:

[root@jay-linux qemu.git]# git bisect reset
Already on 'master'
[root@jay-linux qemu.git]# git bisect start
[root@jay-linux qemu.git]# git bisect good 079944e6
[root@jay-linux qemu.git]# git bisect bad 4b274b16
Bisecting: 55 revisions left to test after this (roughly 6 steps)
[83f58e570f21c3e7227e7fbef1fc0e18b5ed7ea9] rtl8139: preserve link state across device reset
[root@jay-linux qemu.git]# git bisect good
Bisecting: 27 revisions left to test after this (roughly 5 steps)
[4a4343671e183824a3f5db76ad561ce01e6c6e0a] usb/ehci: Move capsbase and opregbase into SysBus EHCI class
[root@jay-linux qemu.git]# git bisect good
Bisecting: 13 revisions left to test after this (roughly 4 steps)
[507066f8a9610c0088df19ce7b3e436f43165ec1] qdev: Include qdev code into *-user, too
[root@jay-linux qemu.git]# git bisect bad
Bisecting: 8 revisions left to test after this (roughly 3 steps)
[c3dd94b129e222e00a4ed00689e11afdd85c740f] Merge remote-tracking branch 'stefanha/net' into staging
[root@jay-linux qemu.git]# git bisect good
Bisecting: 4 revisions left to test after this (roughly 2 steps)
[89eb147c2cfd2c797d3662aa2f55254441f0595a] uhci: stop using portio lists
[root@jay-linux qemu.git]# git bisect bad
Bisecting: 1 revision left to test after this (roughly 1 step)
[358d615b6908b4916c74819ffad823cb4a74314e] exynos4210: Add EHCI support
[root@jay-linux qemu.git]# git bisect bad
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[aee7499a59d6778c10b018da41db4a22655ef8a8] usb/ehci: Add SysBus EHCI device for Exynos4210
[root@jay-linux qemu.git]# git bisect bad
aee7499a59d6778c10b018da41db4a22655ef8a8 is the first bad commit
commit aee7499a59d6778c10b018da41db4a22655ef8a8
Author: Jay <just for fun>
Date:   Sun Dec 16 04:49:45 2012 +0100
### just for testing.  ###
 
:040000 040000 a9ea5da3b5b85d86701f78608405504e9a4de905 0bb166863c84186202c639aff92dd326f1021d42 M      hw


陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn