如何在git历史中grep(搜索)提交的代码?
我过去曾在某个文件中删除过一个文件或一些代码。 我可以在内容中grep(不在提交消息中)吗?
一个非常糟糕的解决方案是grep日志:
git log -p | grep <pattern>
但是,这不会立即返回提交散列。 我玩弄git grep
无济于事。
要搜索提交内容(即实际的源代码行,而不是提交消息等),您需要做的是:
git grep <regexp> $(git rev-list --all)
更新 : git rev-list --all | xargs git grep expression
如果遇到“参数列表太长”的错误, git rev-list --all | xargs git grep expression
将起作用
如果你想限制搜索某个子树(例如“lib / util”),你需要将它传递给rev-list
子命令和grep
:
git grep <regexp> $(git rev-list --all -- lib/util) -- lib/util
这将grep通过所有提交文本的正则表达式。
在两个命令中传递路径的原因是因为rev-list
将返回所有对lib/util
的更改发生的修订列表,但是您还需要传递给grep
以便它仅在lib/util
上进行搜索。
试想一下以下情况: grep
可能会在rev-list
返回的同一版本中包含的其他文件上找到相同的<regexp>
(即使该版本上的该文件没有更改)。
以下是一些其他搜索源的有用方法:
搜索工作树以查找正则表达式正则表达式的文本:
git grep <regexp>
搜索与正则表达式regexp1或regexp2匹配的文本行的工作树:
git grep -e <regexp1> [--or] -e <regexp2>
搜索工作树中与正则表达式regexp1和regexp2匹配的文本行,仅报告文件路径:
git grep -e <regexp1> --and -e <regexp2>
搜索工作树以查找具有匹配正则表达式regexp1的文本行和匹配正则表达式regexp2的文本行的文件:
git grep -l --all-match -e <regexp1> -e <regexp2>
搜索工作树以更改文本匹配模式的行:
git diff --unified=0 | grep <pattern>
搜索文本匹配正则表达式正则表达式的所有修订:
git grep <regexp> $(git rev-list --all)
搜索文本匹配正则表达式regexp的rev1和rev2之间的所有修订:
git grep <regexp> $(git rev-list <rev1>..<rev2>)
你应该使用git log
的镐( -S
)选项
搜索Foo
:
git log -SFoo -- path_containing_change
git log -SFoo --since=2009.1.1 --until=2010.1.1 -- path_containing_change
查看Git历史记录 - 通过关键字查找丢失的行数。
正如JakubNarębski所评论的那样:
这会查找引入或移除<string>
实例的差异 。
它通常意味着“修改你添加或删除行'Foo'”。
--pickaxe-regex
选项允许您使用扩展的POSIX正则表达式而不是搜索字符串。
正如Rob评论的那样,这个搜索是区分大小写的 - 他提出了一个关于如何搜索不区分大小写的后续问题。
我最喜欢的方式是使用git log
的-G
选项(在版本1.7.4中添加)。
-G<regex>
Look for differences whose added or removed line matches the given <regex>.
-G
和-S
选项确定提交是否匹配的方式之间存在细微差别:
-S
选项主要计算在提交之前和之后您的搜索在文件中匹配的次数。 如果前后计数不同,提交会显示在日志中。 例如,这不会显示提交,其中与您的搜索匹配的行已被移动。 -G
选项,如果您的搜索与添加,删除或更改的任何行匹配,则日志中会显示提交。 以此提交为例:
diff --git a/test b/test
index dddc242..60a8ba6 100644
--- a/test
+++ b/test
@@ -1 +1 @@
-hello hello
+hello goodbye hello
由于文件中出现“hello”的次数在提交之前和之后都是相同的,所以它将不匹配使用-Shello
。 但是,由于对匹配hello
的行进行了更改,因此将使用-Ghello
显示提交。
上一篇: How to grep (search) committed code in the git history?