如何在Git历史记录中实现GREP(搜索)提交的代码?

在过去的某个时候,我在文件中删除了一个文件或一些代码。我可以在内容中(而不是在提交消息中)实现grep吗?

一个非常糟糕的解决方案是grep日志:

git log -p | grep <pattern>

但是,这不会立即返回提交哈希。我到处玩git grep没有结果。

如何在Git历史记录中实现GREP(搜索)提交的代码?

斯蒂芬大帝
浏览 933回答 3
3回答

胡子哥哥

搜索提交含量(例如,实际的源代码行,而不是提交消息等等),您需要这样做:git&nbsp;grep&nbsp;<regexp>&nbsp;$(git&nbsp;rev-list&nbsp;--all)git rev-list --all | xargs git grep <expression>如果您遇到“参数列表太长”错误,将工作。如果要将搜索限制在某个子树(例如,“lib/util”),则需要将其传递给rev-list子命令和grep此外:git&nbsp;grep&nbsp;<regexp>&nbsp;$(git&nbsp;rev-list&nbsp;--all&nbsp;--&nbsp;lib/util)&nbsp;--&nbsp;lib/util这将使grep贯穿于您提交的所有文本中。regexp.在这两个命令中传递路径的原因是rev-list的所有更改将返回修订列表。lib/util发生了,但你也需要通过grep所以它只会搜索lib/util.想象一下以下场景:grep可能会找到同样的<regexp>返回的相同版本中包含的其他文件。rev-list(即使对该修订本的档案没有任何改动)。以下是搜索源的其他一些有用方法:搜索文本匹配正则表达式regexp的工作树:git&nbsp;grep&nbsp;<regexp>搜索工作树,查找匹配正则表达式regexp1或regexp2的文本行:git&nbsp;grep&nbsp;-e&nbsp;<regexp1>&nbsp;[--or]&nbsp;-e&nbsp;<regexp2>搜索工作树,查找匹配正则表达式regexp1和regpe 2的文本行,仅报告文件路径:git&nbsp;grep&nbsp;-e&nbsp;<regexp1>&nbsp;--and&nbsp;-e&nbsp;<regexp2>搜索工作树,查找具有文本匹配正则表达式regge 1和文本匹配正则表达式regbe 2行的文件:git&nbsp;grep&nbsp;-l&nbsp;--all-match&nbsp;-e&nbsp;<regexp1>&nbsp;-e&nbsp;<regexp2>搜索工作树,查找更改的文本匹配模式行:git&nbsp;diff&nbsp;--unified=0&nbsp;|&nbsp;grep&nbsp;<pattern>搜索所有修订,以找到匹配正则表达式regexp的文本:git&nbsp;grep&nbsp;<regexp>&nbsp;$(git&nbsp;rev-list&nbsp;--all)搜索Rev1和Rev2之间的所有修订,寻找匹配正则表达式regexp的文本:git&nbsp;grep&nbsp;<regexp>&nbsp;$(git&nbsp;rev-list&nbsp;<rev1>..<rev2>)

梦里花落0921

您应该使用镐(-S)任选git log寻找Foo:git&nbsp;log&nbsp;-SFoo&nbsp;--&nbsp;path_containing_change&nbsp; git&nbsp;log&nbsp;-SFoo&nbsp;--since=2009.1.1&nbsp;--until=2010.1.1&nbsp;--&nbsp;path_containing_change看见Git历史记录-按关键字查找丢失的行为了更多。如Jakub Narębski评论:这,这个查找引入或删除<string>.它的意思通常是“用‘foo’添加或删除行的修订”。这个--pickaxe-regex选项允许您使用扩展的POSIX正则表达式,而不是搜索字符串。如罗布注释,这个搜索是区分大小写的-他打开了一个跟进问题如何搜索-不区分大小写。

米琪卡哇伊

我最喜欢的方法是git log氏-G选项(添加在1.7.4版中)。-G<regex> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Look&nbsp;for&nbsp;differences&nbsp;whose&nbsp;added&nbsp;or&nbsp;removed&nbsp;line&nbsp;matches&nbsp;the&nbsp;given&nbsp;<regex>.在-G和-S选项确定提交是否匹配:这个-S选项实质上计算在提交之前和之后搜索在文件中匹配的次数。如果前后计数不同,则提交将显示在日志中。例如,这将不会显示与搜索相匹配的行被移动的位置。带着-G选项时,如果搜索与添加、删除或更改的任何行匹配,则提交将显示在日志中。以这个提交为例:diff&nbsp;--git&nbsp;a/test&nbsp;b/test index&nbsp;dddc242..60a8ba6&nbsp;100644 ---&nbsp;a/test +++&nbsp;b/test @@&nbsp;-1&nbsp;+1&nbsp;@@ -hello&nbsp;hello +hello&nbsp;goodbye&nbsp;hello由于文件中出现“hello”的次数与此提交之前和之后相同,因此它将不匹配-Shello..但是,由于对行匹配进行了更改hello,则将使用-Ghello.
打开App,查看更多内容
随时随地看视频慕课网APP