是否可以更有针对性地从 git 对分错误中恢复?

Is a more targeted recovery from git bisect mistakes possible?

我知道可以通过 git bisect loggit bisect replay 修复 git bisect 会话,如 this question 的答案中所述。

然而,当我搞砸了一个对分会话时,这可能只是一个错误的决定,我希望能够直接修复它(即不中止整个事情)。

例如,我可以想象只需要执行 rm .git/refs/bisect/good-<hash> 就可以撤消错误的 git bisect good

这是正确的,还是我漏掉了什么?
并且,是否可以对错误的 git bisect bad?

进行类似的操作?

是的,这些引用是 git bisect 用来了解其当前状态的。因此,可以通过使用 git update-ref.

调整 refs 来撤销错误的 git bisect good

但是,这有两个问题:

  1. 好的和坏的提交由 git bisect:

    标记不同
    • 所有标记为良好的提交都会获得 refs/bisect/good-<commit id> 引用。因此,这可以通过相应的

      git update-ref -d refs/bisect/good-<commit id>
      
    • 但是,git bisect 仅跟踪单个错误提交,因此您需要使用

      将 ref refs/bisect/bad 重置为已知的错误提交
      git update-ref refs/bisect/bad <really bad commit id>
      

      您可能需要查看对分日志(在 .git/BISECT_LOG 下或通过 git bisect log)以找出将 refs/bisect/bad ref 重置为哪个提交。

  2. 除了 refs 之外,git bisect 还在位于 .git/BISECT_LOG 的日志中跟踪其所有操作。虽然此日志与正常操作无关,但您自己摆弄 refs 将导致无意义的日志。当然,您可以忽略它或相应地修复日志,但这不会比您链接的解决方案更好。

所以,是的,这是可以做到的,但需要付出代价。总而言之,保存日志、修复它并重播它似乎是更好的选择。