是否可以更有针对性地从 git 对分错误中恢复?
Is a more targeted recovery from git bisect mistakes possible?
我知道可以通过 git bisect log
和 git 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
但是,这有两个问题:
好的和坏的提交由 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 重置为哪个提交。
除了 refs 之外,git bisect
还在位于 .git/BISECT_LOG
的日志中跟踪其所有操作。虽然此日志与正常操作无关,但您自己摆弄 refs 将导致无意义的日志。当然,您可以忽略它或相应地修复日志,但这不会比您链接的解决方案更好。
所以,是的,这是可以做到的,但需要付出代价。总而言之,保存日志、修复它并重播它似乎是更好的选择。
我知道可以通过 git bisect log
和 git bisect replay
修复 git bisect
会话,如 this question 的答案中所述。
然而,当我搞砸了一个对分会话时,这可能只是一个错误的决定,我希望能够直接修复它(即不中止整个事情)。
例如,我可以想象只需要执行 rm .git/refs/bisect/good-<hash>
就可以撤消错误的 git bisect good
。
这是正确的,还是我漏掉了什么?
并且,是否可以对错误的 git bisect bad
?
是的,这些引用是 git bisect
用来了解其当前状态的。因此,可以通过使用 git update-ref
.
git bisect good
但是,这有两个问题:
好的和坏的提交由
标记不同git bisect
:所有标记为良好的提交都会获得
refs/bisect/good-<commit id>
引用。因此,这可以通过相应的git update-ref -d refs/bisect/good-<commit id>
但是,
将 refgit bisect
仅跟踪单个错误提交,因此您需要使用refs/bisect/bad
重置为已知的错误提交git update-ref refs/bisect/bad <really bad commit id>
您可能需要查看对分日志(在
.git/BISECT_LOG
下或通过git bisect log
)以找出将refs/bisect/bad
ref 重置为哪个提交。
除了 refs 之外,
git bisect
还在位于.git/BISECT_LOG
的日志中跟踪其所有操作。虽然此日志与正常操作无关,但您自己摆弄 refs 将导致无意义的日志。当然,您可以忽略它或相应地修复日志,但这不会比您链接的解决方案更好。
所以,是的,这是可以做到的,但需要付出代价。总而言之,保存日志、修复它并重播它似乎是更好的选择。