如何grep Git提交某个单词的差异或内容?

在Git代码库中,我想列出包含某个单词的所有提交。 我试过这个

git log -p | grep --context=4 "word" 

但是这并不一定会让我知道文件名(除非我所search的文字远不及5行),我也试过了

 git grep "word" 

但它只给出我现在的文件,而不是历史。

如何search整个历史logging,以便我可以跟踪特定单词的变化? 我的意思是search我的代码库的单词出现追踪更改(在文件历史search)。

如果你想查找提交信息包含给定单词的所有提交,请使用

 $ git log --grep=word 

如果你想查找文件内容中添加或删除“word”的所有提交(更确切的说:“word”出现的次数改变了),即search提交内容 ,使用所谓的“pickaxe”search

 $ git log -Sword 

在现代的混帐也有

 $ git log -Gword 

寻找添加或删除的行匹配“单词”(也提交内容 )的差异

请注意, -G默认接受正则expression式,而-S接受一个string,但可以修改为使用--pickaxe-regex接受--pickaxe-regex

为了说明-S<regex> --pickaxe-regex-G<regex>之间的区别,请考虑在同一个文件中使用以下差异的提交:

 + return !regexec(regexp, two->ptr, 1, &regmatch, 0); ... - hit = !regexec(regexp, mf2.ptr, 1, &regmatch, 0); 

git log -G"regexec\(regexp"会显示这个提交, git log -S"regexec\(regexp" --pickaxe-regex不会(因为该string的出现次数没有改变)。

git log的镐会用git log -Swordfind包含“word”的git log -Sword

经过大量的实验后,我可以推荐下面的代码,它显示了提交或者删除包含给定正则expression式的行,并且在每个行中显示文本变化,颜色显示增加和删除的单词。

 git log --pickaxe-regex -p --color-words -S "<regexp to search for>" 

需要一段时间才能运行… 😉

另外一种方法/语法是: git log -S "word"
像这样,你可以search例如git log -S "with whitespaces and stuff @/#ü !"

你可以尝试下面的命令:

 git log --patch --color=always | less +/searching_string 

或者用下面的方法使用grep

 git rev-list --all | GIT_PAGER=cat xargs git grep 'search_string' 

在要search的父目录中运行此命令。

vim-vgitive是在Vim中用于这种检查的多function程序。

使用:Ggrep来做到这一点。 欲了解更多信息,您可以安装vim-fugitive,并通过:help Grep查找。 而这个插曲: 探索Git-repository-history-of-git-repository会引导你去做所有的事情。

在正则expression式上使用布尔连接器:

 git log --grep '[0-9]*\|[az]*' 

这个正则expression式在提交消息上search正则expression式[0-9] *或[az] *。