撤销一个git bisect错误

219

我正在通过命令行进行非自动化的git二分法。一切顺利,直到我在命令历史记录中误按了一个错误的行并执行了“git bisect good”(或bad)而不是运行测试。糟糕 - 我还不知道这个提交应该被标记为好或坏,但我已经这样做了。

我能撤销“git bisect good”命令,或使git忘记它的结果,并回去运行那个提交的测试吗?

3个回答

275

来自git-bisect文档

二分日志和二分重现

在标记了好的或者坏的版本之后,执行以下命令以显示到目前为止已经完成的工作:

$ git bisect log
如果您发现在指定修订版本的状态时犯了错误,您可以将此命令的输出保存到文件中,编辑该文件以删除不正确的条目,然后发出以下命令以返回到已更正的状态:
$ git bisect reset
$ git bisect replay that-file

1
太复杂了,有太多的依赖关系。不带任何参数,取决于当前存储库状态(即“that-file”),哪个命令或命令序列可以保证将存储库重置为错误命令之前的状态? - Szczepan Hołyszewski
4
从我看到它开始,到我错误地执行了一个多余的"git bisect good"操作之前,只用了25秒钟。这里没有任何“取决于情况”的部分。只是按照字面意思去做。它并不复杂。执行命令git bisect log > f; vim f; git bisect reset; git bisect replay f; - oligofren
1
然后执行 rm f(或 rm that-file):) 我知道这很明显,但当我看到留下未使用文件的指令时,它会让我感到不爽(我知道在这种情况下,由于是关于 git 存储库,你会注意到它,但并非总是如此)。 - Iulian Onofrei
@oligofren 我认为第一条评论是在寻找类似于 git bisect undo 的东西,这将非常不错... - BallpointBen
他可以在他的.gitconfig中为此添加一个别名:bisect-undo ='git bisect log | sed -e'$ d'> /tmp/trimmed-log; git bisect reset; git bisect replay /tmp/trimmed-log; rm /tmp/trimmed-log;。然后他可以随心所欲地执行git bisect-undo :) - oligofren

131
你可以使用以下代码输出记录:
$ git bisect log > bisect.log

在编辑器中打开那个文件并编辑/删除错误的那一行,然后你就可以重放它了

$ git bisect replay bisect.log

详细信息请参考git help bisect


1
你是否需要像@manojlds的回答所示那样执行git bisect reset - Colin D
2
@ColinD,我不需要先重置。我正在使用Git版本2.19.1.windows.1。 - AlexMA
我必须首先重置,使用 git 版本 2.25.1。 - remcycles

2
如果你想一次性撤销你最后的指令,而不需要使用文字编辑器,那么你可以使用以下命令:
git bisect log | head -n -2 > /tmp/fixed_bisect.log ; git bisect replay /tmp/fixed_bisect.log

它将删除日志的最后两行(因为有注释和实际对应的命令),然后将其保存到文件中,并直接使用 bisect replay 重用它。(不幸的是,bisect replay 无法直接通过管道接收输入,因此需要创建一个临时中间文件。)

为了使它更容易,您可以在 .bashrc 或等效文件中添加别名:

# bisect undo alias
alias bisectundo="git bisect log | head -n -2 > /tmp/fixed_bisect.log ; git bisect replay /tmp/fixed_bisect.log"

在新的会话中,您可以简单地使用bisectundo来后退一步。

如果您因为负数参数而收到“非法行计数”错误(这是因为某些head实现不支持它),您可以使用这个更长的形式,它基于使用wc计算日志长度来确定要保留的行数:

git bisect log | head -n $(($(git bisect log | wc -l)-2)) > /tmp/fixed_bisect.log ; git bisect replay /tmp/fixed_bisect.log

这是一个好主意,但您的建议会出现 head: illegal line count -- -2 的错误。 - henrique
@henrique 我修改了我的答案,并加入了一个选项,以应对这种情况。 - stragu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接