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

时间:2014-05-25 12:50:38

标签: git bash git-bisect

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

另一个原因是不要只是从前一段时间选择提交并将其用作好用是因为在我的repo中有许多不良和良好的提交混合在一起。它不是线性的。

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

1 个答案:

答案 0 :(得分:6)

while ! good-or-bad-test-command ; do
   git checkout HEAD^
done

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

$ 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
...

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

git checkout避免移动您的分支HEAD,让您处于&#34;分离状态&#34;您可以使用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

如果我们有一个具有很长历史的git,并且发现很久以前已经破坏的东西(以前未经测试的东西现已经过测试),我们可以指数地向后探测以找到一个好的提交:git checkout HEAD~16;如果那不好,git checkout HEAD~32;然后git checkout HEAD~64

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