二分法查找是基于有序_Git工具二分查找

当需要从Git历史中恢复删除的文件时,通过二分查找算法能高效定位。本文介绍了如何确定查找区间,启动并进行二分查找,标记结果直至找到删除文件的提交节点,最终完成文件恢复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

318aa54a34ab41b65705eec8f2893b0f.png

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

ced948a61820bfa2916c8c26a73622a7.gif

大致步骤如下:

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

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

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

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

b6e4ad85d19ad3635942a23062ba60a6.png

git-log-with-wc

什么是二分查找?

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

3e8623e2ab7433b28a5cd96613a42dc3.gif

binary search(图片来源于网络)

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

启动二分查找

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

git bisect start  

d3915f282c5f21c0431053819e462a05.png

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] # 标注当前节点是没有问题的,往后续提交的记录中折半查询

dfac9e52ee2977250f57cc23f01d0705.png

git bisect mark node result

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

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

1a681434a41f969f9d0efbfac7581d92.png

git bisect log

结束查找

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

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

git bisect reset  # 切到问题节点

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

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

来一发

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

git clone git@github.com:bradleyboy/bisectercise.git

9c7963c9fdd2138da3cef169d8466153.png

git@github.com:bradleyboy/bisectercise.git
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值