Git bisect:开发者工具包中被低估的调试工具

图0:Git bisect:开发者工具包中被低估的调试工具

让我们设定一个场景。

周一早上,您喝着咖啡,准备迎接新的一天。您调出最新的更改,启动应用程序……然后 “砰 ”的一声。登录崩溃了。你的代码没有任何变化,但 repo 中的某些内容肯定发生了变化。

现在怎么办?难道要从 100 多条提交中筛选出一条导致混乱的错误提交?

好消息来了: Git 可以帮你。
它叫 git bisect,是开发者工具包中最被低估的调试工具之一。

那么,git bisect 到底是什么呢?

git bisect 想象成二进制搜索 bug。Git 不需要手动检查每个提交,而是通过检查 “好 ”提交(运行正常)和 “坏 ”提交(已损坏)之间的中间点,帮你快速缩小范围。

如果 bug 是在 100 次提交中悄悄出现的,那么 git bisect 只需 7 个步骤就能找到罪魁祸首。没错,就是这么高效。

🧑‍💻 真实场景: 登录崩溃案例

元素周期表假设您应用程序的登录功能停止工作了。您现在使用的是最新提交(HEAD),而且您清楚地记得三天前在提交 abc123 时登录功能运行得很好。

您没有时间(或耐心)去逐个扫描提交,所以就让 Git 来帮您侦查吧。

方法如下

# Start the detective mode
git bisect start

# This is where the bug exists -- on HEAD (current commit)
git bisect bad

# This is where everything was sunshine and rainbows
git bisect good abc123

Git 现在会检出介于好提交和坏提交之间的一个提交。你测试该提交,并将其标记为 “好 ”或 “坏”:

# If login works:
git bisect good

# If login is broken:
git bisect bad

Git 会不断缩小搜索范围,直到找到导致登录失败的提交。最后会以类似

abcd567 is the first bad commit

找到了。找到了✅

⚙️ 厌倦了手动测试?让我们自动化它。

如果每一步都要手动测试,就会变得很重复。这就是 git bisect 支持脚本自动化的原因。

示例:test_login.sh

假设您使用的是 Node.js,测试套件中有一个登录测试。创建一个这样的文件

#!/bin/bash

npm install > /dev/null 2>&1
npm test -- login > /dev/null 2>&1

if [ $? -eq 0 ]; then
  exit 0   # Login works
else
  exit 1   # Login broken
fi

现在运行

git bisect start
git bisect bad
git bisect good abc123
git bisect run ./test_login.sh

Git 会处理剩下的工作–检查提交、运行测试,并告诉你是哪个提交破坏了测试。

想要更花哨?通过 API 测试

这里有一个适用于暴露登录 API 的应用程序的版本:

#!/bin/bash

npm run build > /dev/null 2>&1
npm start &

# Give server a moment to start
sleep 3

# Test login endpoint
curl -s -X POST http://localhost:3000/api/login 
  -d '{"username":"test", "password":"pass"}' 
  | grep -q "Welcome"

RESULT=$?

# Kill the server
kill $(lsof -t -i:3000) 2>/dev/null

exit $RESULT

这实际上是启动你的应用程序,点击登录端点,并寻找成功的响应。如果发现 “Welcome”(欢迎),则表示提交成功。

✅ 为什么开发者应该使用 git bisect

  • 🔍 速度快–使用二进制搜索逻辑
  • 🧪 可以完全自动化
  • 🧠节省处理回归错误的时间
  • 👥在发生大量变更的大型团队中非常有用

出现错误。出现回归错误。但调试工作不必像大海捞针。

git bisect 能将你的错误查找变成有指导的调查。一旦你开始使用它,你会惊叹没有它你是怎么调试的。

下次再有什么神秘的 bug 时,不要惊慌–bisect it。

阅读余下内容
 

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注


京ICP备12002735号