公众号关注 “程序员遇见GitHub”

设为“星标”,重磅干货,第一时间送达。

作为程序员,在职场当中经常遇到出现了问题需要定职定责的情况。比如某个系统出现了bug,导致了故障,那么这口锅究竟是谁的?这个是需要讨论的,一般来说需要测试、开发一起来背锅。如果代码不是我们写的,我们肯定是不想背这个锅的,那么怎么样来证明出bug地方的代码是谁写的呢?

这个时候我们就可以使用git来寻找代码的提交记录,从而找到罪魁祸首。

追查记录

Git当中有一个很重要的功能叫做git blame,从名字我们就可以看出来,这个功能是用来甩锅的。我们可以通过它查找到每一个文件每一行的提交记录,究竟这行代码是谁修改和引入的,非常方便我们用来定责。

Git blame可以传入一个参数L指定某一个文件的行数,比如我随便找了一个我private的repo运行了一下:

git blame -L 23,30 myhive.py

这里的23,30表示的myhive.py这个文件行数的起始位置,开始是第23行,结束是第30行。接着我们会进入到一个vim文件当中,给我们详细展示这些代码的情况。


我们可以看到结果分成4列,第一列是commit id,对应的是这一行代码是在哪一个commit当中出现的,第二列是提交人,也就是做出修改的人。第三列是修改时间,第四列是具体的代码内容。

当然由于这是我个人的repo,所以看到的代码都是我个人修改的。如果是大家一些协同开发的项目,就可以看到多人提交的情况了。

当然现在一些先进的IDE当中也集成了这个功能,比如著名的jetbrains全家桶,我们可以通过右键选择git,之后选择Annotate,之后代码左侧会展示对应的修改人以及修改时间,方便我们追查代码的修改对象。其实也不只是在问责,比如在阅读其他团队的代码的时候,遇到问题了,要找对应的人询问,也是一个很好的方法。


二分查找

我第一次看到这个功能的时候的确被惊艳了,但是回想起来至今好像也没用上过。可能在一些特定的场景下会有用吧。

有的时候我们的repo会非常巨大,会有很多的开发者,我们每次上线的时候会合并数十个提交。这就导致了一个问题,当我们上线测试的时候,如果发现了bug会很难排查,因为你不知道是哪一个提交带来的问题。这个时候一个比较好的办法当然是二分查找,当然我们也可以手动进行,然而git当中集成了这个功能,我们直接使用就好。

首先我们运行git bisect start,表示我们开始二分查找。bisect就是git当中二分查找的工具。

之后我们继续输入git bisect bad,表示当前的分支是有问题的。接着我们输入git bisect good xxxx,这里的xxxx是一个commitid或者是一个标签,告诉git我们最后一次已知的正确的提交是哪一个。这样git会把当前和这个提交之间的提交全部找出来,假如说这当中一共发生了23个提交,那么git会选出中间的提交进行跳转。

这个时候如果我们在这个中间的分支上测试OK,那么我们就输入git bisect good,告知git这个分支是正确的,从而帮助它缩小范围。如果这个分支错误,那么就输入git bisect bad。

当二分到最后git找到了那个最早出问题的提交之后,它会告诉我们提交的commitid以及相关的提交记录,这样可以方便我们更快地找到bug。

由于我没有很好的测试repo,所以只能找来一张截图,当我们找到错误的分支之后,git输出的结果是这样的,注意一下下方的提示语:


最后,不要忘了使用git bisect reset重置HEAD指针回到最开始的位置,否则可能会陷入一些奇怪的状况当中。

如果我们有健全的测试脚本可以测试提交是否正确的话,比如正确返回1否则返回0,我们也可以让git自动执行二分查找。比如这样:

git bisect start HEAD xxxxgit bisect run test_case.sh

这样git会调用test_case.sh这个文件,直到找出错误提交为止。其实还是挺方便的,只是我作为开发的时候很少接触这么多提交一起发布的状况,一般来说要处理的提交数量都很少,有bug也很容易找到。

今天的文章就到这里,衷心祝愿大家每天都有所收获。如果还喜欢今天的内容的话,请来一个三连支持吧~(点赞、在看、转发)

推荐阅读:

我教你如何读博!

牛逼!轻松高效处理文本数据神器

B站强化学习大结局!

如此神器,得之可得顶会!

兄弟们!神经网络画图,有它不愁啊

太赞了!东北大学朱靖波,肖桐团队开源《机器翻译:统计建模与深度学习方法》

当年毕业答辩!遗憾没有它...

已开源!所有李航老师《统计学习方法》代码实现

这个男人,惊为天人!手推PRML!

它来了!《深度学习》(花书) 数学推导、原理剖析与代码实现

你们心心念念的MIT教授Gilbert Strang线性代数彩板笔记!强烈推荐!

GitHub超过9800star!学习Pytorch,有这一份资源就够了!强推!

你真的懂神经网络?强推一个揭秘神经网络的工具,ANN Visualizer

诸位!看我如何白嫖2020 icassp!

这个时代研究情感分析,是最好也是最坏!

BERT雄霸天下!

玩转Pytorch,搞懂这个教程就可以了,从GAN到词嵌入都有实例

是他,是他,就是他!宝藏博主让你秒懂Transformer、BERT、GPT!

fitlog!复旦邱锡鹏老师组内部调参工具!一个可以节省一篇论文的调参利器

Github开源!查阅arXiv论文新神器,一行代码比较版本差别,我爱了!

开源!数据结构与算法必备的 50 个代码实现

他来了!吴恩达带着2018机器学习入门高清视频,还有习题解答和课程拓展来了!

太赞了!复旦邱锡鹏老师NLP实战code解读开源!

这块酷炫的Python神器!我真的爱了,帮助你深刻理解语言本质!实名推荐!

论文神器!易搜搭

不瞒你说!这可能是世界上最好的线性代数教程

git统计每个人的代码行数_项目出了bug如何甩锅?使用这个Git工具帮你找到元凶...相关推荐

  1. git统计每个人的代码行数_程序员实用工具,推荐一款代码统计神器GitStats

    阅读全文需7分钟,工具很实用. 1. 前言 对于Git项目开发,有一些可视化的工具,如gitk,giggle等,来查看项目的开发历史.但对于大型的项目,这些简单的可视化工具远远不足以了解项目完整的开发 ...

  2. 【git】统计每个人的代码行数

    #!/bin/bashrm -f ~/git.log cd 路径/repositories# 获取所有的仓库 for dir in $(ls ./) docd $dir# 获取子目录for dir1 ...

  3. 统计java代码行数_统计项目代码行数

    今天测试告知需要项目的代码行数,项目怎么也有十万左右的代码行数,想想就想奔溃了, Eclipse一定有这方面的统计,应该也有统计工具,于是上网查了一番,果然找到了. 1.我要查询的文件类型为*.xml ...

  4. gitlub统计一个人提交代码行数

    查看git提交历史 在提交了若干更新,又或者克隆了某个项目之后,你也许想回顾下提交历史. 完成这个任务最简单而又有效的工具是 git log 命令. 不传入任何参数的默认情况下,git log 会按时 ...

  5. 统计代码行数_推荐一波代码量、行数、提交量、作者等全维度统计神器

    背景 代码各种维度的统计在有些时候是很重要的,这里总结一些常用的牛逼的代码统计工具,着重介绍了个人使用的 Statistic 插件.但是如果你是想统计团队维度的数据,推荐后面介绍的 git_stats ...

  6. eclipse代码量统计插件_Android Studio 代码行数统计插件Statistic的简单使用

    在项目开发过程中,有时候需要统计代码行数(比如组长想关心一下你的代码量,或者要申请软件著作权时),需要统计的文件类型主要是 .java..xml..kt等,已经有人开发好相关插件了,如果你是用Andr ...

  7. c++ 不要节约代码行数_不要只是代码,但也c

    c++ 不要节约代码行数 程序员的生活 (Programmers' Life) I owe my passion for coding to a very dear friend of mine, w ...

  8. idea 查询项目代码行数_程序员的福利,四个技巧,让OneNote支持代码高亮

    点击蓝字 关注我们 写在前面 对于程序员来说,代码高亮是最基本的需求. 印象笔记.有道云笔记.为知笔记都提供了相应的功能. 而OneNote,沿袭了微软"术业有专攻"的理念,并没有 ...

  9. pycharm 查看代码行数_【收藏】提高PyCharm效率的10个小技巧

    PyCharm是最常用的python开发IDE,程序员可以通过PyCharm强大的功能节约大量时间用来 摸鱼 工作,提高生产效率. 阿狗总结了10个自己会用到的PyCharm中可以提高撸码效率的小技巧 ...

最新文章

  1. python中yield的认识与学习|生成器
  2. 面向生信分析的高性 RStudio 服务器
  3. 深度好文:Linux操作系统内存
  4. ExcelPro《EXCEL图表之道-如…
  5. 前端那些事之原生 js实现贪吃蛇篇
  6. android数据库开发案例教程,Android Studio项目开发教程 第6章 数据库编程(30页)-原创力文档...
  7. OpenShift 4 之 GitOps(5)用ArgoCD配置其他OpenShift资源
  8. 【nginx】关于fastcgi_cache
  9. 关于目前深度学习技术的相关思考----个人理解笔记
  10. 3dmax教程技术:3dmax 怎么去掉贴图_3dmax如何去掉贴图
  11. COSCon'20 Apache Roadshow- China 精彩收官!|城市回顾篇
  12. [springboot 开发单体web shop] 1. 前言介绍和环境搭建
  13. 这45道面试可能被问到的JS判断题!你能答对几道?
  14. iphone相册储存空间已满_iPhone 总提示“iCloud储存空间将满”,如何解决?
  15. 2020年有寓意的领证日期_2020年领证的好日子-2020有寓意的领证日期【蜜匠婚礼】...
  16. 【华人学者风采】胡事民 清华大学
  17. 设置微信分享的标题 缩略图 连接 描述
  18. 在Pycharm中更新安装最新版本pip,安装tensorflow
  19. 百世集团去年第四季度总收入达90.4亿元 净亏损2400万元
  20. 博客从 WordPress 迁移至 Halo

热门文章

  1. Git的pull clone fetch
  2. 监控操作系统和服务器,LoadRunner如何监控不同操作系统的服务器?
  3. PHP被忽视的编码规范
  4. vhd 镜像 备份Linux,差分VHD 系统秒备份、秒还原教程 完胜GHOST
  5. html文字图片同一行,CSS控制图片和文字在同一行显示且对齐的3种方法
  6. java回调如何理解_如何理解java中的回调
  7. 视觉错觉模型_有才!将立体模型涂改伪装成平面二次元,视觉错觉玩法在日本风靡...
  8. mysql 5.6 缓存_为什么默认情况下从MySQL 5.6开始禁用query_cache_type?
  9. Eureka修改实例名称
  10. 对VOC目标检测数据进行增强