如何在一个分支的提交中“git bisect”?

时间:2013-11-27 10:56:07

标签: git version-control git-bisect

在我正在进行的项目中,我们保留每个功能都有自己的功能,并在功能准备好后将其合并回主功能。每个功能分支内的提交可能包含许多“WIP”和其他功能的破坏功能,直到它完整和稳定。

无论如何,由于master分支的提交是唯一的(假定的)稳定的,我只希望git bisect在那个分支上。

有没有办法仅在一个分支上限制git bisect

4 个答案:

答案 0 :(得分:20)

没有进一步的工作,没有简单的方法可以做到这一点。在玩了一会儿后,我有一些可能对你有用的东西。

git bisect start master f9d5924

for rev in $(git rev-list f9d5924..master --merges --first-parent); do
  git rev-list $rev^2 --not $rev^
done | xargs git bisect skip

这会启动git bisect,f9d5924作为您的良好提交,master作为您的错误提交。然后它找到每个合并提交右侧的祖先不在左侧。它将这些祖先传递给git bisect skip以跳过它们。但是当它确定哪个提交不好时,它将显示来自错误合并提交的所有可能的跳过提交。如下

$ git bisect good
There are only 'skip'ped commits left to test.
The first bad commit could be any of:
0622204625d8817c5d8fd1a2a68b3aa91f2dcdf9
0c771566b9e77e3bdc0a66a7404c8eae9f321a68
5098b44f43f84b213eaab110073a6acd26a5cc02
8b05a808d5e15852fbddaa529ba241fdac8ff693
b0c755c3fa57e3c8d527e76fae38bc9925c01353
We cannot bisect more!

在这种情况下,b0c755c3fa57e3c8d527e76fae38bc9925c01353是失败的合并提交。

编辑:如果您有章鱼合并,这将

答案 1 :(得分:0)

我认为带有git bisect标志的--no-parent可以很容易地做到这一点,但它不存在。

我唯一能想到的就是在新分支中重新创建分支提交。这是Linux shell中的一个例子:

$ git branch bisecttemp <first>
$ for h in `git log --oneline --decorate --first-parent --reverse --format=%H <first>..<last>`; do git checkout -f $h; sleep .5; git reset bisecttemp; git commit -am"$h"; git checkout testing; git reset --hard HEAD@{1}; done

这使得bisecttemp分支脱离了我们关心的<first>提交,获取了我们关注的范围内<first><last>提交之间的哈希列表,访问每个,在不改变工作树的情况下,重新设置回bisecttemp分支,提交与它所来自的提交的哈希值不同的一切,再次检出bisecttemp,然后将其重置回头部的最后一个位置,这是新的提交。

可能有一种更聪明的方法来完成所有这些,但基本的是它在我们关心的提交范围的开始之外创建一个新的分支,然后提交仅分支提交的状态(常规提交)并按顺序合并,但不合并任何子分支。你不能只是在这里挑选,因为樱桃选择看父母,这会在合并提交中失败。

这未经过实际测试,可能都是错误的。这只是一个想法。它可以在一个提交一系列提交的函数中汇总。

答案 2 :(得分:-1)

我也想要一个适当的本地到git的解决方案来解决这个问题,只检查单个分支上的提交,从而“责备”整个合并和/或Pull Request。但是:

  

因为master分支的提交是唯一的(假定的)稳定的,所以我想只在那个分支上进行git bisect。

如果提示此问题的问题是您提交的某些提交已损坏且您无法测试,则可以使用:

git bisect skip

完全跳过该提交并检查另一个提交。这将解决您在提交失败时遇到的问题。一旦找到破坏该功能的提交,您就可以将其跟踪到合并到您正在跟踪的分支中。

我想你甚至可以通过手动检查或通过脚本来git bisect skip所有未合并的提交。这会产生问题中提到的行为。

答案 3 :(得分:-2)

在一个分支上使用git bisect而不检查master:
在你要测试的分支上。

git bisect start --no-checkout

这将仅启动当前分支上的bisect

正常继续你的bisect。