找到最近的好提交传递给git bisect

Xu *_*ang 4 git bash git-bisect

假设我突然发现我的Git回购失败了.但我知道它在几个提交之前工作,我只是不记得哪个提交.我想问Git(可能带有bash脚本),而不是试图找到一个"好"的提交来做一个git bisect,最近的"好"提交是什么?

另一个原因是不要只是暂时选择一个提交并将其用作好的,因为在我的repo中有很多糟糕和好的提交混合在一起.这不是线性的.

那么我怎么能循环,从最近的提交开始,并且只要有必要,执行一个返回1的命令,如果错误0则返回1?

Kaz*_*Kaz 6

while ! good-or-bad-test-command ; do
   git checkout HEAD^
done
Run Code Online (Sandbox Code Playgroud)

但是,如果破损仅在某个地方的最后几次提交中,您可以手动执行此操作.

$ good-or-bad-test-command
# if it fails, then:
$ git checkout HEAD^ # pop to previous
$ good-or-bad-test-command # <-- recalled by hitting up arrow in bash
# still fails:
$ git checkout HEAD^ # <-- recalled with up arrow
$ good-or-bad-test-command # <-- recalled
...
Run Code Online (Sandbox Code Playgroud)

感谢历史回忆,它比敲打循环需要更少的击键次数.

git checkout避免移动您的分支HEAD,使您处于"分离状态",您可以从中轻松恢复git checkout <yourbranch>.

[编辑,2017年3月]

但是,问题是,为什么你仍然会git bisect在这种情况下使用?你已经通过糟糕的提交线性搜索到了好的提交; 没有必要对另一个二进制搜索相同的信息.

可能更少的步骤来猜测找到一些仍然很好的提交,然后git bisect开始.

如果您怀疑最近破坏了某些内容,请返回16次提交.或32或其他什么.返回上一个标记的版本.二进制搜索将很快归零:

$ git bisect start
$ git bisect bad # HEAD known to bad; almost always the case
$ git checkout HEAD~8  # wild guess; almost certainly before breakage
$ good-or-bad-test-command # check: is it really good?
$ # if not, git checkout HEAD~8 # go back more, repeat test
$ git bisect good  # bisect begins
Run Code Online (Sandbox Code Playgroud)

如果我们有一个很长的历史的Git,并发现有什么东西在很久以前坏了(一些先前未测试的这是目前测试),我们可以探测向后成倍找到一个很好的承诺:git checkout HEAD~16; 那么,如果这不是很好的,git checkout HEAD~32; 然后git checkout HEAD~64.

这是通过未知范围进行二进制搜索的一般策略.不要线性扫描以确定范围,因为这会使算法成为线性的.如果我们以指数方式扩展范围,我们将其保持对数.