如何搜索git存储库历史以查找合并错误?

如何搜索git存储库历史以查找合并错误?,git,merge,Git,Merge,在过去的某个时候,git的开发分支被合并了。然而,做出了错误的合并决策,因此一些代码没有进入我们预期的主分支。(在最终合并到主分支之前,存在多个不同分支的合并。因此分支和合并历史相当复杂。) 有没有一种简单的方法可以搜索git存储库来确定在哪个合并上做出了“错误”的决定 (我已经知道这个特定案例的答案,但找到它的过程有点乏味。) 编辑:git Dull被证明不充分的原因是,在合并错误之后的某个时间,在提交中触及了该行 对您的情况有帮助吗?如果您知道一个文件中有一行被git分支合并修改过,您可以执

在过去的某个时候,git的开发分支被合并了。然而,做出了错误的合并决策,因此一些代码没有进入我们预期的主分支。(在最终合并到主分支之前,存在多个不同分支的合并。因此分支和合并历史相当复杂。)

有没有一种简单的方法可以搜索git存储库来确定在哪个合并上做出了“错误”的决定

(我已经知道这个特定案例的答案,但找到它的过程有点乏味。)


编辑:git Dull被证明不充分的原因是,在合并错误之后的某个时间,在提交中触及了该行

对您的情况有帮助吗?

如果您知道一个文件中有一行被git分支合并修改过,您可以执行“git gull file.txt”并确定文件中该行的提交哈希数和提交作者。然后,您可以查看git日志,并调出与坏分支合并相关联的确切提交

编辑: 作为对作者评论的回应,如果你正在寻找某一行的消失,那么“git diff”结合grep和二进制搜索可能是你想要的。假设您有提交编号0,1,2,3,4,5,6。您知道该行存在于版本0中,但在版本6中消失。使用“git diff”和grep搜索失踪者

git diff 0 6 | grep '- line I care about'
在第一次迭代中,您将看到您关心的行消失。然后将修订号减半,然后重试

git diff 0 3 | grep '- line I care about'
如果grep仍然显示该行消失(带有“-”号),那么您知道该行在修订版0到3中消失了。如果grep没有显示该行消失,则该行在修订版4-6中消失


继续将修订内容一分为二,直到找到罪魁祸首。

没有更多细节,我只能暗示可能的解决方案。如果您知道受影响的文件或行,您可以尝试(
git gull*file*
,或
git gull*revision**file*
),也可以尝试所谓的“鹤嘴锄搜索”,即
git log-S'*line*
尝试查找引入给定行的修订,或删除给定行。您可以查找和检查所有合并,例如通过
git log-p-m--grep=Merge
,并检查它们与它们的父级的关系(
-m
向所有父级显示差异;或者
-c
显示组合差异,但不显示细微的合并更改,即,如果有一方被采用)。

对于寻求更简单解决方案的其他人,启动
gitk
(或从Git GUI转到Repository>Visualize X History)并使用其查找工具。

Git log具有强大的搜索选项。由于有迹象表明您可能知道某个代码块已消失,因此可以搜索该代码串

git日志-S“我关心的行”-diff filter=M

将从这里到那里搜索
-S
之后的字符串,并且仅搜索修改(添加或删除)行的位置


如果使用-G而不是-S,您可以在搜索中获得更高的精度。使用-S,G提供正则表达式搜索而不是字符串文字搜索。

问题是,在“合并错误”之后的某个时间,该行被触碰了。我知道补丁是什么时候推出的,但不知道它是什么时候退出的。与其使用git diff和search,不如使用git log提供的选项。具体来说,请尝试
git log-S“我关心的线”-diff filter=M
您描述的过程就是git bisect所做的。但是,您不必计算散列数。虽然您的0-6、0-3/4-6等模式清晰易懂,但不能使用提交编号。您必须使用提交散列,这一点尚不清楚。git bisect是你的朋友。这太棒了!我不知道这件事。非常感谢。使用-p选项可以非常方便地显示补丁,而不是提交摘要。因此,您可以实际看到匹配的提交的更改。请注意,您必须添加选项
-c
,此选项才能正常工作。否则,
git log
将跳过由合并提交引入的更改。