查找问题的利器 - Git Bisect

假设你在项目的‘2.6.18‘版上面工作, 但是你当前的代码(master)崩溃(crash)了. 有时解决这种问题的最好办法是: 手工逐步恢复(brute-force regression)项目历史, 找出是哪个提交(commit)导致了这个问题. 但是 linkgit:git-bisect1 可以更好帮你解决这个问题:

$ git bisect start
$ git bisect good v2.6.18
$ git bisect bad master
Bisecting: 3537 revisions left to test after this
[65934a9a028b88e83e2b0f8b36618fe503349f8e] BLOCK: Make USB storage depend on SCSI rather than selecting it [try #6]

如果你现在运行"git branch", 会发现你现在所在的是"no branch"(译者注:这是进行git bisect的一种状态). 这时分支指向提交(commit):"69543", 此提交刚好是在"v2.6.18"和“master"中间的位置. 现在在这个分支里, 编译并测试项目代码, 查看它是否崩溃(crash). 假设它这次崩溃了, 那么运行下面的命令:

$ git bisect bad
Bisecting: 1769 revisions left to test after this
[7eff82c8b1511017ae605f0c99ac275a7e21b867] i2c-core: Drop useless bitmaskings

现在git自动签出(checkout)一个更老的版本. 继续这样做, 用"git bisect good","git bisect bad"告诉git每次签出的版本是否没有问题; 你现在可以注意一下当前的签出的版本, 你会发现git在用"二分查找(binary search)方法"签出"bad"和"good"之间的一个版本(commit or revison).

在这个项目(case)中, 经过13次尝试, 找出了导致问题的提交(guilty commit). 你可以用 git show 命令查看这个提交(commit), 找出是谁做的修改,然后写邮件给TA. 最后, 运行:

$ git bisect reset

这会到你之前(执行git bisect start之前)的状态.

注意: git-bisect 每次所选择签出的版本, 只是一个建议; 如果你有更好的想法, 也可以去试试手工选择一个不同的版本.

运行: $ git bisect visualize

这会运行gitk, 界面上会标识出"git bisect"命令自动选择的提交(commit). 你可以选择一个相邻的提交(commit), 记住它的SHA串值, 用下面的命令把它签出来:

$ git reset --hard fb47ddb2db...

然后进行测试, 再根据测试結果执行”bisect good"或是"bisect bad"; 就这样反复执行, 直到找出问题为止.

译者注: 关于"git bisect start"后的分支状态, 译文和原文不一致. 原文是说执行"git bisect start"后会创建一个名为"bisect"的分支, 但是实际情况却是处于"no branch"的状态.

时间: 2024-08-09 02:19:48

查找问题的利器 - Git Bisect的相关文章

查找问题的利器 - Git Blame

原文: http://gitbook.liuhui998.com/5_5.html 如果你要查看文件的每个部分是谁修改的, 那么 git blame 就是不二选择. 只要运行'git blame [filename]', 你就会得到整个文件的每一行的详细修改信息:包括SHA串,日期和作者: 译者注: Git采用SHA1做为hash签名算法, 在本书中,作者为了表达方便,常常使用SHA来代指SHA1. 如果没有特别说明, 本书中的SHA就是SHA1的代称. $ git blame sha1_fil

让 Git Bisect 帮助你

让 Git Bisect 帮助你 英文原文:Letting Git Bisect Help You Git 提供来很多的工具来帮助我们改进工作流程. bisect 命令就是其中之一, 虽然由于使用得不多而不广为人知,但是当你想知道一个本来好的分支从什么时候开始变坏时,它就能派上用场了.到底是哪一次提交把事情搞砸了呢,让 bisect 来告诉你吧. Bisect 基于二分查找算法.给定一个有序的元素序列,它会返回要你要查找的元素的序号(或者告诉你该元素是否在序列中).它基于如下的不变式:当你对比完

使用 git bisect 定位你的 BUG

Git 是开发者的好帮手,今天跟大家分享的是用 git bisect 来找到你代码中的 bad commit . 背景 你可能遇到过这种情况, 昨天下班前把模块开发完了, 单元测试验证通过, git commmit 盖上电脑 开开心心下班啦 ?? 第二天啥上午来了,继续开发,提交了几个 commit ,下午部署了一个版本,发现昨天测试通过的代码出现了 BUG ?? 这个时间你会怎么做, 可能的翻出现 BUG 代码文件的 git log 一翻发现 有20个 commit ??? 此时你的心情可能是

git bisect

reference : http://www.ruanyifeng.com/blog/2018/12/git-bisect.html git bisect 命令教程 作者: [12]阮一峰 日期: [13]2018年12月24日 [14] 腾讯课堂 NEXT 学院 git bisect是一个很有用的命令,用来查找哪一次代码提交引入了错误. 它的原理很简单,就是将代码提交的历史,按照两分法不断缩小定位.所谓"两分法",就是将代码历史一分为二,确定问题出在前半部分,还是后半部分,不断 执行

[Practical Git] Diagnose which commit broke something with git bisect

Sometimes you find a bug in your project that has been around for a while without being noticed; it can be hard to track down where that bug was introduced and why just by searching through logs and diffs. Git has a slick tool called git bisect that

git用法大全

转载自实验楼,之前有更新过两篇git的文章,毕竟内容太少,而git还有很多更丰富的技能,在实验楼上有一系列全的教程,这里做一下备案.需要时查阅. Git 实战教程 目录 一.实验说明 二.git的初始化 1.Git 配置 三.获得一个Git仓库 1.Clone一个仓库 2.初始化一个新的仓库 四.正常的工作流程 1. 正常的工作流程 五.分支与合并 1.分支 2. 撤销一个合并 3.快速向前合并 六.Git日志 1.查看日志 2.日志统计 3.格式化日志 4.日志排序 七.小结 八.练习 一.实

Git 版本控制(命令行)

前言 git这个版本控制工具,早在两三年前我就开始使用了.不过后来换了新东家后,又开始变成了svn,最近又切成git了. 通过近期的使用,遇到了一些坑,遂引发此文,以作记录 issue:某个commit整体不要了,想重置?add多了,想撤销?某个文件有问题,想还原到某次commit时的状态?想push到另外的远程仓库?什么!这行代码是哪个鬼加进去的,引起了bug?咦,这个bug,在好几个版本都存在,是哪次commit引起的?- 本文都能找到答案 注:可以通过上面的目录,来选取自己感兴趣的内容,进

Git手册

GitUserManualChinese - Robin Wiki GitUserManualChinese Git 用户手册(1.5.3 及后续版本适用) 翻译: 罗峥嵘 (Robin Steven) < [email protected] > 英文版本: http://www.kernel.org/pub/software/scm/git/docs/user-manual.html Contents Preface 前言 Chapter 1. Repositories and Branch

《Git版本控制管理》第二部分:一些命令

part2基本概念 1.find .git -查看git的目录结构 2.git ls-files --stage  -查看索引状态下暂存文件及其blob对象(16进制的提交码) //不用管(树和标签) git write-tree  -查看git树的哈希码 git cat-file -p 8dfef03b27e8b49c44c57cf5641b0056802e3b33 -根据树的哈希码,查看git目录下文件结构 git tag -m "Tag version 1.0haha” V1.0 -创建标