转载自: http://smilejay.com/2013/01/git-bisect/
git中的二分查找(git bisect)
用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工具有如下的错误提示:
遇到这种情况下,可以换一种思考方式,既然 “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”的用法:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
[
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
|