在我们过去的某些时候,git的开发分支被合并了.但是,做出了错误的合并决定,因此有些代码没有进入我们预期会出现的主分支.(在最终合并到主分支之前,有多个不同分支的合并.因此分支和合并历史相当复杂.)
有没有一种简单的方法来搜索git存储库以确定哪个合并做出了"错误"的决定?
(我已经知道这个特例的答案,但找到它的过程有点乏味.)
编辑:git blame证明不合适的原因是在合并错误后的某个时间触及了行.
没有更多细节,我只能暗示可能的解决方案.如果您知道受影响的文件或行,您可以尝试使用git-blame(git blame *file*
,或git blame *revision* *file*
),或者您可以使用git-log尝试所谓的' pickaxe search' ,即尝试查找引入给定行的修订版,或删除给定行.您可以查找并检查所有合并,例如通过,并检查它们与父项的关系(向所有父项显示差异;或者显示组合差异,但不显示简单的合并更改,即如果采取了一方).git log -S'*line*
git log -p -m --grep=Merge
-m
-c
在您的案例中可以git-bisect帮助吗?
Git日志具有强大的搜索选项.由于有迹象表明您可能知道一大块代码消失了,您可以搜索该代码串
git log
将从此处搜索到此处的字符串-S
以及仅在修改(添加或删除)行的位置
如果使用-G而不是-S,则可以在搜索中获得更高的精度.-G提供正则表达式搜索,而不是使用-S进行字符串文字搜索.
如果您知道由git branch merge修改的文件中的一行,您可以执行'git blame 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中消失.
继续将修订版切成两半,直到找到罪魁祸首.