git grep --cached

时间:2009-11-17 20:03:57

标签: git grep

我误解了git grep --cached foo的工作原理吗?运行git版本1.6.4.4或1.6.5.2,git grep --cached foo返回与git grep foo完全相同的内容。

我认为它会像git diff --cached一样工作,只搜索暂存区域的变化。这肯定是man page引导我相信的:

git diff [--options] --cached [<commit>] [--] [<path>…]
     

此表单用于查看您为下一次提交相对于指定的<commit>暂存的更改。通常,您希望与最新提交进行比较,因此如果您不提供<commit>,则默认为HEAD。如果HEAD不存在(例如,未出生的分支)且未给出<commit>,则会显示所有分阶段的更改。 --staged--cached的同义词。

这只是一个错误,还是有替代/更好的方法来查找提交foo的更改?

git diff --cached | grep foo

上面的命令给了我一半我想要的东西,但它丢失了变化出现在哪个文件的上下文。

更新

看来我对--cached所看到的内容有一个概念错误。假设应用了暂存区域,它看起来正在搜索树的状态。这是有道理的,现在我考虑一下。我想要搜索的是差异,而不是完整的树。

具体来说,我想知道我即将提交SpecialLog(...)的所有文件列表(我不关心行号或上下文),所以我可以编辑这些文件并删除{ {1}}。所以是的,我可以做SpecialLog并在寻呼机中搜索git diff --cached,但是对于单个文件中的大量更改,会有很多重复,并且我看起来哪个文件并不明显在

1 个答案:

答案 0 :(得分:9)

$ git init
Initialized empty Git repository in /tmp/foo/.git/
$ echo hi there >file
$ git add file
$ git commit -m 'added file'
[master (root-commit) dc08993] added file
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 file
$ echo hi again >>file
$ git grep again
file:hi again
$ git grep --cached again
$

时间流逝......

$ git add file
$ git grep --cached again
file:hi again

要将搜索范围限制为下一次提交的内容,git diff会将其输出传递给$PAGER。假设您已将寻呼机设置为lessgit diff --cached会在上下文中显示搜索匹配。

在索引中搜索具有提及特殊字符串的更改的文件,如以下示例所示:

$ echo SpecialLog >file2
$ git add file2
$ git diff-index --cached --name-only HEAD
file
file2
$ git diff-index --cached -SSpecialLog --name-only HEAD
file2
$ git diff --cached -SSpecialLog --name-only
file2