如何在一个分支的提交记录中执行 `git bisect`?

39
在我目前正在处理的项目中,我们将每个功能都放在自己的分支上,在功能准备好后合并到主分支。每个功能分支内部的提交可能包含很多“WIP”和破坏其他功能的功能,直到它是完整且稳定的。
无论如何,由于主分支的提交是唯一(假定)稳定的,我想只在该分支上使用git bisect
是否有一种方法可以限制git bisect仅在一个分支上?

2
可能是重复问题:https://dev59.com/TW035IYBdhLWcg3wE71s - bacar
3个回答

27

没有简单的方法可以轻松完成这个任务,需要进一步努力。经过一段时间的尝试,我有了一些可以帮助你的东西。

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

这将以f9d5924作为良好的提交,以master作为不良的提交启动 git bisect。然后它查找每个合并提交右侧的祖先(但左侧没有),并将这些祖先传递给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 是合并提交时失败的点。 注意: 如果您有一个八爪鱼合并(将多个分支合并在一起的合并),则此方法将无法起作用。

8
我认为 git bisect 需要一个 --first-parent 标志,并在帮助文档中描述其含义。这将只遍历实际分支的提交和合并提交,而不是它所合并的其他分支或分支泡沫。你要么找到了你分支上的提交,在其他提交中嵌套着,要么最后停留在一个合并提交上,并知道问题出现在合并到那个点的分支中。 - Gary Fixler

2
我也希望有一个适合Git的解决方案来解决这个问题,只检查单个分支上的提交,从而“归咎于”整个合并和/或拉取请求。然而:
由于主分支的提交是唯一(假定)稳定的,我想仅在该分支上使用git bisect。
如果引发此问题的问题是您收到的某些提交已损坏且无法进行测试,则可以使用:
git bisect skip 完全跳过该提交并检查另一个提交。这将解决您在处理损坏提交时遇到的问题。找到导致功能中断的提交后,您可以跟随它到合并到您正在跟踪的分支的位置。
我想您甚至可以手动检查或通过脚本检查所有不是合并的提交,并跳过所有这些提交。这将提供所需的行为。

0

我认为使用带有--no-parent标志的git bisect可以轻松完成此操作,但它不存在。

我能想到的唯一方法是在新分支中重新创建分支提交。以下是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,并将其重置回head所在的最后位置,即新提交。

可能有更聪明的方法来完成所有这些操作,但基本原理是创建一个新分支,从我们关心的提交范围的开头开始,然后按顺序将分支专用提交(常规提交和合并,但不包括任何子分支提交)提交到该分支上。你不能只是在这里挑选樱桃,因为樱桃选择会查看父级,这将在合并提交上失败。

这并没有经过真正的测试,可能全部都是错误的。这只是一个想法。它可以被整合成一个接受一系列提交范围的函数。


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