在我目前正在处理的项目中,我们将每个功能都放在自己的分支上,在功能准备好后合并到主分支。每个功能分支内部的提交可能包含很多“WIP”和破坏其他功能的功能,直到它是完整且稳定的。
无论如何,由于主分支的提交是唯一(假定)稳定的,我想只在该分支上使用
是否有一种方法可以限制
无论如何,由于主分支的提交是唯一(假定)稳定的,我想只在该分支上使用
git bisect
。是否有一种方法可以限制
git bisect
仅在一个分支上?git bisect
。git bisect
仅在一个分支上?没有简单的方法可以轻松完成这个任务,需要进一步努力。经过一段时间的尝试,我有了一些可以帮助你的东西。
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
是合并提交时失败的点。
注意: 如果您有一个八爪鱼合并(将多个分支合并在一起的合并),则此方法将无法起作用。git bisect
需要一个 --first-parent
标志,并在帮助文档中描述其含义。这将只遍历实际分支的提交和合并提交,而不是它所合并的其他分支或分支泡沫。你要么找到了你分支上的提交,在其他提交中嵌套着,要么最后停留在一个合并提交上,并知道问题出现在合并到那个点的分支中。 - Gary Fixler我认为使用带有--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所在的最后位置,即新提交。
可能有更聪明的方法来完成所有这些操作,但基本原理是创建一个新分支,从我们关心的提交范围的开头开始,然后按顺序将分支专用提交(常规提交和合并,但不包括任何子分支提交)提交到该分支上。你不能只是在这里挑选樱桃,因为樱桃选择会查看父级,这将在合并提交上失败。
这并没有经过真正的测试,可能全部都是错误的。这只是一个想法。它可以被整合成一个接受一系列提交范围的函数。