如何在应用额外补丁的场景下干净顺畅执行git bisect定位故障提交
问题原因
你遇到的报错是--no-commit参数的cherry-pick逻辑导致的:使用该参数批量应用多段提交时,所有已成功应用的提交改动只会放在暂存区/工作区,不会生成中间提交,遇到冲突后cherry-pick的流程链已经断裂,cherry-pick --continue无法识别这种非提交式的应用状态,所以会报错。
当前卡住状态的解决方法
你已经完成冲突修复并执行了git add .,此时所有需要的补丁改动已经全部就绪,不需要继续执行cherry-pick相关命令:
- 执行
git cherry-pick --quit退出当前cherry-pick流程,该操作不会清除你已经做好的改动 - 正常测试当前版本的故障表现
- 测试完成后,执行
git reset --hard HEAD清空所有临时补丁改动,回到bisect提供的纯净提交状态 - 按照测试结果执行
git bisect good或git bisect bad进入下一轮二分即可
更稳定的长期流程优化
为了避免后续每轮二分都遇到类似问题,可以调整打补丁的方式:
方式1:改用git am应用补丁
- 先把你需要的补丁范围导出为独立补丁包:
git format-patch 820aca592e0c^..58915847b332 -o ~/tps68470-patches - 每轮bisect切换到新提交后,用
git am ~/tps68470-patches/*.patch应用补丁 - 遇到冲突时,修复冲突后执行
git add .,再执行git am --continue即可完成补丁应用,不会出现之前的报错 - 测试完成后执行
git am --abort && git reset --hard HEAD回到干净状态即可
方式2:自动化二分(适合测试流程可标准化的场景)
你可以编写一个简单的测试脚本,内容大致如下:
#!/bin/bash # 尝试应用补丁 git am ~/tps68470-patches/*.patch if [ $? -ne 0 ]; then # 补丁应用失败,跳过该提交 git am --abort exit 125 fi # 此处添加你的编译、测试逻辑 # 测试通过返回0(对应bisect good),测试失败返回1(对应bisect bad) make -j$(nproc) ./run-your-test-case.sh TEST_RET=$? # 清理改动 git reset --hard HEAD exit $TEST_RET
然后执行git bisect run ./your-test-script.sh,git会自动完成所有二分步骤,无需手动处理每一轮操作。
你之前的顾虑解答
如果不带--no-commit参数cherry-pick生成临时提交,不会影响bisect逻辑:bisect的计算只依赖你标记good/bad时对应的原始二分提交的哈希,你在之上新增的临时提交会在每轮测试后的git reset --hard中被完全清除,不会干扰二分范围的计算。
内容的提问来源于stack exchange,提问作者Dan Scally
相关产品推荐
相关产品推荐

