You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在应用额外补丁的场景下干净顺畅执行git bisect定位故障提交

问题原因

你遇到的报错是--no-commit参数的cherry-pick逻辑导致的:使用该参数批量应用多段提交时,所有已成功应用的提交改动只会放在暂存区/工作区,不会生成中间提交,遇到冲突后cherry-pick的流程链已经断裂,cherry-pick --continue无法识别这种非提交式的应用状态,所以会报错。

当前卡住状态的解决方法

你已经完成冲突修复并执行了git add .,此时所有需要的补丁改动已经全部就绪,不需要继续执行cherry-pick相关命令:

  1. 执行git cherry-pick --quit退出当前cherry-pick流程,该操作不会清除你已经做好的改动
  2. 正常测试当前版本的故障表现
  3. 测试完成后,执行git reset --hard HEAD清空所有临时补丁改动,回到bisect提供的纯净提交状态
  4. 按照测试结果执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.25 18:15:03