我误解了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
,但是对于单个文件中的大量更改,会有很多重复,并且我看起来哪个文件并不明显在
答案 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
。假设您已将寻呼机设置为less
,git 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