gpt4 book ai didi

git - 你如何让 git bisect 忽略 merge 的分支?

转载 作者:IT王子 更新时间:2023-10-29 00:56:22 28 4
gpt4 key购买 nike

我知道 git bisect 在设计上是分支感知的,所以如果在好的提交 G 和坏的提交 B 之间,你 merge 到一个分支中,它也需要考虑这些更改,因为该错误可能包含在分支中。

在我的例子中,我有一个依赖项作为一个分支,我不时地 merge 对我的主项目的更改。依赖项可以被认为是一个库,它具有与我的主项目不同的运行方式、不同的构建系统等,但我仍然希望通过 merge 到主分支来对其进行最近的更改。

问题在于,在这种情况下进行二等分时,您最终会在来自依赖项的提交中遇到不可编译的提交。

我真的只想在进行二分法时将每个分支 merge 视为单个提交。

到目前为止,我发现的一个解决方法是使用 git log --first-parent 列出有效提交 G..B,然后在平分时,如果当前提交不在该列表中,则执行 git bisect skip .但这会花费很多时间(每次跳过都要 checkout /更改大量文件)。

所以问题是:是否有任何方法可以使用 git bisect 执行 --first-parent 或提供我认为有效的提交列表,从而避免检查我知道已经不可编译的分支?我们如何只检查图中标记为 o 的提交?

G---o---o---o---o---o---o---B  main project branch   /       /       /   x---x---x---x---x            dependency           \ /            x'                 dependency project taskbranch

编辑:为清晰起见添加图表

最佳答案

我想到了一种可能的解决方案,但我仍然希望找到更优雅的解决方案:

将所有 merge 到主分支的所有第二父级标记为好

将每个 merge 的所有远程父级标记为良好会将它们之前的所有提交视为良好(并且因此被二分法跳过)。该解决方案还应该足够通用以处理来自多个分支的多个 merge ,仅将提交留在主分支上。

git rev-list --first-parent --merges --parents GOOD..BAD \
| sed 's/^[^ ][^ ]* [^ ][^ ]* //' \
| xargs git bisect good

(用相关提交替换 GOOD 和 BAD)

sed 中的正则表达式删除每行的前两个提交; merge 提交本身和第一个父级,留下其余的父级(通常只是第二个)。

考虑到问题中陈述的历史,运行单行代码会给你:

G---o---o---o---o---o---o---B  main project branch   /       /       /   G---x---G---x---G            dependency           \ /            x'                 dependency project taskbranch

这将使 bisect 仅遍历主分支上的提交:

    o---o---o---o---o---o

如果任何 merge 的分支是问题的间接原因,当您通过 bisect 测试 merge 提交时会发现它,这可能是对该分支进行进一步调查的原因。

关于git - 你如何让 git bisect 忽略 merge 的分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5638211/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com