vlambda博客
学习文章列表

Git工具-二分查找

周五的时候临时接到一个任务需要用到一位调岗同事的脚本,却发现他之前写的脚本不知在什么时候被删掉了...突入起来的噩耗真是:哮天犬晒太阳--日狗了。幸好用了Git进行管理代码仓库,只要可以用闪电五连鞭的速度找出该脚本在什么节点被删除然后进行恢复,那么我就可以按时背上电脑去吃饭了。

Git工具-二分查找

大致步骤如下:

  1. 确定区间:查找了该名同事最后的提交记录,确认当时记录是否存在

git log -1 --author=xxx --pretty=oneline # 限制查找指定作者的提交记录

若存在:那么该文件则是在同事调岗之后的提交中被删除;若不存在:则该文件是在该名同事在职期间被删除

  1. 使用git bisect在确定的提交区间中查询出对应的提交节点

Git工具-二分查找

git-log-with-wc

什么是二分查找?

二分查找(binary search-又叫:折半查找),是一种在已知有序阵列中搜寻某一特殊元素的高效查找算法,其时间复杂度为O(log2n)

Git工具-二分查找

binary search(图片来源于网络)

二分法的原理很简单:对有限区间进行对半拆分,确定问题是在节点的前半部分还是后半部分,然后不断的重复该过程,将问题缩小,直到确定问题。

启动二分查找

设置二分查找的区间,启动二分查找

git bisect start <from commitId> <end commitId>

Git工具-二分查找

git bisect start <起点> <重点>

有两点值得留意:

  1. 由于Git的提交日志是按照时间顺序倒序排列的,此处的from commitId是近期提交,即:一定是在end commitId之后的时间提交的记录。如果两者顺序调转了会报下列的错误提醒

  2. 启动二分查找、标记节点结果后,提示信息都会告诉你roughly xx steps大致还有多少步能确定出结果

$ git bisect start 4d83cfc 85530fd

Some good revs are not ancestors of the bad rev.
git bisect cannot work properly in this case.
Maybe you mistook good and bad revs?

标记结果

git bisect [bad|new] # 标注当前节点是有问题的,向更早的记录折半查询
git bisect [good|old] # 标注当前节点是没有问题的,往后续提交的记录中折半查询

Git工具-二分查找

git bisect mark node result

不断的标识结果,将区间不断缩小,直到确定问题。当区间不能再进行折半查找的时候,Git会打印出一个具体的提交点日志信息fisrt bad commit:xxxxx

git bisect log # 查看二分查找的过程

git bisect log

结束查找

git bisect reset [<commitId>] # 结束二分查找,切到指定的commit点-默认是HEAD

找到问题节点后,可以使用git bisect reset切换到对应节点,但要注意:此时的分支是处于游离状态的(即:不在任一有效分支上)。

git bisect reset <问题节点> # 切到问题节点

git checkout -b <bugfix-xxx> # 针对当前节点切换创建一个有效分支 

在临时有效分支上对问题进行修复,进行提交,再合并到主干分支中。

来一发

GitHub上有人提供了一个小demo,供大家练习熟悉练习:从`101`个提交中找出一个错误的提交。

git clone [email protected]:bradleyboy/bisectercise.git


[email protected]:bradleyboy/bisectercise.git