我有一个很少有分支和悬空提交的Git存储库。我想在存储库中搜索一个特定字符串的所有这样的提交。

我知道如何获得历史中所有提交的日志,但这些不包括分支或悬垂的blobs,只包括HEAD的历史。我想把它们都找回来,找到一个被放错地方的特定提交。

我还想知道如何在Mercurial做到这一点,因为我正在考虑切换。


当前回答

除了使用git log -g——grep=<regexp>或git grep -e <regexp> $(git log -g——pretty=format:%h)的richq答案之外:看看以下由当前git维护者Junio C Hamano撰写的博客文章

有趣的“git日志-grep” 有趣的“git grep”


总结

git grep和git log——grep都是面向行的,因为它们寻找匹配指定模式的行。

你可以使用git log——grep=<foo>——grep=<bar>(或者git log——author=<foo>——grep=<bar>,内部转换为two——grep)来查找匹配任何一种模式(隐式或语义)的提交。

由于是面向行的,有用的AND语义是使用git log——all-match——grep=<foo>——grep=<bar>来查找在某个地方同时有第一个行匹配和第二个行匹配的提交。

使用git grep,您可以将多个模式(所有模式都必须使用-e <regexp>形式)与——or(默认值)、——and、——not、(and)组合在一起。对于grep——all-match意味着文件必须有与每个替代选项匹配的行。

其他回答

如果您是vim用户,您可以安装tig (apt-get install tig),并使用/,相同的命令在vim上搜索

https://blogs.atlassian.com/2013/05/git-tig/

除了使用git log -g——grep=<regexp>或git grep -e <regexp> $(git log -g——pretty=format:%h)的richq答案之外:看看以下由当前git维护者Junio C Hamano撰写的博客文章

有趣的“git日志-grep” 有趣的“git grep”


总结

git grep和git log——grep都是面向行的,因为它们寻找匹配指定模式的行。

你可以使用git log——grep=<foo>——grep=<bar>(或者git log——author=<foo>——grep=<bar>,内部转换为two——grep)来查找匹配任何一种模式(隐式或语义)的提交。

由于是面向行的,有用的AND语义是使用git log——all-match——grep=<foo>——grep=<bar>来查找在某个地方同时有第一个行匹配和第二个行匹配的提交。

使用git grep,您可以将多个模式(所有模式都必须使用-e <regexp>形式)与——or(默认值)、——and、——not、(and)组合在一起。对于grep——all-match意味着文件必须有与每个替代选项匹配的行。

我不知道git,但在Mercurial中,我只是将hg log的输出管道到一些sed/perl/任何脚本来搜索你正在寻找的东西。如果您愿意,可以使用模板或样式自定义hg日志的输出,使其更易于搜索。

这将包括回购中所有已命名的分支。Mercurial没有像悬挂blobs之类的东西。

在Mercurial中,使用hg log——keyword搜索提交消息中的关键字,使用hg log——user搜索特定用户。有关限制日志的其他方法,请参阅hg help log。

为了补充一个尚未提到的解决方案,我不得不说,使用gitg的图形搜索框对我来说是最简单的解决方案。它将选择第一个事件,您可以使用Ctrl-G找到下一个事件。