2009-02-16 96 views
8

在我们过去的git开发分支中的某个时候被合并。然而,错误的合并决定已经完成,因此一些代码并没有将其纳入我们预期的主分支中。 (在最终合并到一个主分支之前有不同分支的多个合并,因此分支和合并历史相当复杂。)如何搜索git存储库历史记录以查找合并错误?

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

(我已经知道了这种特殊情况下的答案,但发现它的过程是有点乏味)

编辑:原因git的怪证明是不够为该线在提交某个时候触及后合并错误。

回答

7

如果你知道被git分支合并修改过的文件中的一行,你可以做'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中消失。

继续剪裁修改一半,直到找到罪魁祸首。

+0

问题是该行在“合并错误”后的某个时候被触及。我知道补丁什么时候推出,但不知道它何时首次退出。 – Atlas1j 2009-02-17 01:43:46

+1

然后使用git log提供的选项来进行git diff和search。特别是,尝试`git log .. -S“我关心的行”--diff-filter = M` – 2011-08-12 04:34:06

10

没有更多的细节我只能暗示可能的解决方案。如果你知道影响了文件或行,你可以尝试要么git-blamegit blame *file*,或git blame *revision* *file*),或者你可以尝试所谓的“搜索”与git-log,即git log -S'*line*试图找到其介绍给定的行或删除特定的修订线。您可以找到并检查所有合并,例如通过git log -p -m --grep=Merge,并检查它们与父母的关系(-m向所有父母显示差异;或者-c显示合并差异,但不显示合并差异的轻微变化,即如果采用一方) 。

0

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

9

Git日志具有强大的搜索选项。因为有你可能知道的那个消失了的代码块中的指示,你可以搜索的代码串

git log <HERE>..<THERE> -S"line I care about" --diff-filter=M

将从这里-S后搜到那里的字符串,只有当行修改(添加或删除)

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

相关问题