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

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

git log -p | grep <pattern>

但是,这不会立即返回提交哈希。 我和git grep玩了无济于事。


#1楼

我最喜欢的方法是使用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显示提交。


#2楼

如果您想浏览代码更改(请查看整个历史记录中给定单词实际更改的内容),请使用patch模式-我发现这样做非常有用:

git log -p
# hit '/' for search mode
# type in the word you are searching
# if the first search is not relevant hit 'n' for next (like in vim ;) )

#3楼

@Jeet的答案在PowerShell中有效。

git grep -n <regex> $(git rev-list --all)

以下显示所有提交中包含password所有文件。

# store intermediate result
$result = git grep -n "password" $(git rev-list --all)# display unique file names
$result | select -unique { $_ -replace "(^.*?:)|(:.*)", "" }

#4楼

那么,您是否要遍历旧版本的代码,以查找最后存在的内容?

如果执行此操作,则可能会使用git bisect 。 使用bisect,您可以指定一个已知的好版本,一个已知的坏版本以及一个简单的脚本,该脚本进行检查以查看该版本的好坏(在这种情况下,将使用grep来查看您要查找的代码是否存在) )。 运行此命令将找到删除代码的时间。


#5楼

您应该使用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所说,此搜索区分大小写-他就如何搜索不区分大小写提出了一个后续问题 。


#6楼

要搜索提交内容 (即,实际的源代码行,而不是提交消息等),您需要执行以下操作:

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

这将遍历regexp所有提交文本。

在两个命令中都传递路径的原因是因为rev-list将返回所有对lib/util进行更改的修订列表,但是您还需要传递给grep以便它仅在lib/util搜索。

试想一下以下情形: grep可能在rev-list返回的同一修订版中包含的其他文件上找到相同的<regexp> (即使该修订版上的文件没有更改)。

以下是一些其他有用的搜索来源的方法:

在工作树中搜索与正则表达式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>

搜索所有修订以查找与正则表达式regexp匹配的文本:

git grep <regexp> $(git rev-list --all)

在rev1和rev2之间的所有修订中搜索与正则表达式regexp匹配的文本:

git grep <regexp> $(git rev-list <rev1>..<rev2>)

#7楼

搜索任何版本,任何文件

git rev-list --all | xargs git grep <regexp>

仅搜索某些给定的文件, 例如 XML文件:

git rev-list --all | xargs -I{} git grep <regexp> {} -- "*.xml"

结果行应如下所示:6988bec26b1503d45eb0b2e8a4364afb87dde7af:bla.xml:找到的行的文本...

然后,您可以使用git show获得更多信息,例如作者,日期,差异:

git show 6988bec26b1503d45eb0b2e8a4364afb87dde7af

#8楼

以我为例,我需要搜索“短期提交”,但不幸的是,列出的解决方案不起作用。

我设法做到这一点:(替换REGEX令牌)

for commit in $(git rev-list --all --abbrev-commit)
doif [[ $commit =~ __REGEX__ ]]; then git --no-pager show -s --format='%h %an - %s' $commitfi
done

#9楼

对于任何其他尝试在Sourcetree中执行此操作的人 ,UI中都没有针对它的直接命令(自1.6.21.0版开始)。 但是,可以通过打开“ 终端”窗口(主工具栏中的按钮)并在其中复制/粘贴来使用接受的答案中指定的命令。

注意:Sourcetree的“ 搜索”视图可以部分为您执行文本搜索。 按Ctrl + 3转到“搜索”视图(或单击底部的“搜索”选项卡)。 从最右边,将“搜索类型”设置为“ 文件更改” ,然后键入要搜索的字符串。 与上述命令相比,此方法具有以下限制:

  1. Sourcetree仅显示已更改文件之一中包含搜索词的提交 。 查找包含搜索文本的确切文件还是手动任务。
  2. 不支持RegEx。

#10楼

git log是在所有分支中搜索文本的更有效方法,尤其是在存在许多匹配项的情况下,并且您希望首先查看最近的(相关)更改。

git log -p --all -S 'search string'
git log -p --all -G 'match regular expression'

这些日志命令列出了提交,这些提交添加或删除了给定的搜索字符串/正则表达式(通常)是最近的。 -p选项使相关的差异显示在添加或删除模式的位置,因此您可以在上下文中看到它。

找到相关的提交后添加您要查找的文本(例如8beeff00d),找到包含该提交的分支:

git branch -a --contains 8beeff00d

#11楼

git rev-list --all | xargs -n 5 git grep EXPRESSION

是@Jeet解决方案的一项调整,因此它在搜索时显示结果,而不仅仅是在结尾显示(在大型存储库中可能要花费很长时间)。


#12楼

为了简单起见,我建议使用GUI: gitk-Git存储库浏览器 。 非常灵活

  1. 要搜索代码:

  2. 搜索文件:

  3. 当然,它也支持正则表达式:

您可以使用向上/向下箭头浏览结果。


#13楼

场景:您使用IDE清理了代码。 问题:IDE清理了过多的垃圾,现在您的代码无法编译(缺少资源等)。

解:

git grep --cached "text_to_find"

它将找到更改了“ text_to_find”的文件。

现在,您可以撤消此更改并编译代码。


#14楼

每当我发现自己在您的位置时,都会使用以下命令行:

git log -S "<words/phrases i am trying to find>" --all --oneline  --graph

说明:

  1. git log需要在这里写更多内容; 它按时间顺序显示日志。
  2. -S "<words/phrases i am trying to find>" -它显示所有那些Git提交,其中任何文件(添加/修改/删除)都包含我要查找的单词/短语,而没有'<>'符号。
  3. --all在所有分支上强制执行和搜索。
  4. --oneline将Git日志压缩为一行。
  5. --graph创建按时间顺序排列的提交图。

#15楼

我接受@Jeet的答案并将其适用于Windows(由于此答案 ):

FOR /F %x IN ('"git rev-list --all"') DO @git grep <regex> %x > out.txt

请注意,对我而言,由于某种原因,删除此正则表达式的实际提交未出现在命令的输出中,而是出现在该命令的输出之前。

如何在Git历史记录中grep(搜索)已提交的代码相关推荐

  1. 如何在Git分支中搜索文件或目录?

    本文翻译自:How can I search Git branches for a file or directory? In Git, how could I search for a file o ...

  2. 彻底删除git历史记录中的文件

    有时候,我们需要删除 git 历史记录中的某个文件. 有种情况是在你开发一个项目的时候,刚开始是闭源的,里面可能包含一些比较敏感的信息,用户名和密码等,后来想将这个项目开源了,但这些用户名和密码的配置 ...

  3. 如何在Java项目中查找未使用/无效的代码

    本文翻译自:How to find unused/dead code in java projects What tools do you use to find unused/dead code i ...

  4. git提交后push中出现之前的提交的代码或者其他人提交的代码

    git提交后push中出现之前的提交的代码或者其他人提交的代码 问题现象 1.项目最外层目录的pom.xml文件,右键输入git reset --mixed HEAD~7指令,撤销commit的全部内 ...

  5. 如何在git bash中启用复制粘贴快捷键

    方法一: 1.鼠标右键点击左上角,选择属性(如果是英文就选择properties): 2.在选项中勾选相应选项: 然后就完事了 方法二: 从其他地方复制一段文本 2 打开Git Bash命令行窗口 3 ...

  6. 如何在Mirth Connect中创建和调用自定义Java代码

    0-前言 本文章将向您展示如何创建自定义Java类,将其编译/打包到JAR中,将其包含在Mirth Connect在,并在JavaScript中调用它,您可以从任何JavaScript上下文调用自定义 ...

  7. git初始化本地仓库,远程提交远端代码教程

    首先进入代码仓库目录:执行git init 在github创建仓库,建立README文件 本地仓库与远程仓库建立连接本地仓库添加了github上的git仓库作为远程仓库,起名origingit rem ...

  8. SVN 撤回已提交的代码

    1. TortoiseSVN -----> Show log 2.右键点击你想撤回的提交 -> Revert changes from this revision ----->Rev ...

  9. SVN撤销已提交的代码

    1. TortoiseSVN -----> Show log 右键点击你想撤回的提交 -> Revert changes from this revision ----->Rever ...

最新文章

  1. 面试结尾——你有什么问题?
  2. Git客户端(TortoiseGit)基本使用详解
  3. 转【微信小程序 四】二维码生成/扫描二维码
  4. input框保持两位小数
  5. 计算机物联网知识,2016年职称计算机考试Internet基础知识:物联网
  6. excel批量删除单元格中的部分内容
  7. 摩尔斯密码输出I LOVE YOU ,SOS
  8. phyton计算每天进步的力量
  9. 今日头条安卓_考察今日头条总部—字节跳动
  10. SpringBoot_01_初窥门径
  11. 爬虫爬取二次元网站美女图片
  12. 《痞子衡嵌入式半月刊》 第 66 期
  13. Java分页查询详解
  14. 【环信IM集成指南】Web端常见问题整理
  15. Android 模拟游戏手柄按键(跨进程 KeyEvent 事件)实践方案
  16. 总算挽回点面子,中国上月为印尼发射通信卫星定点成功 运行正常
  17. 系列文章|闲鱼商品理解之精品库建设
  18. answer的汉语_answer是什么意思中文翻译(answer中文意思及应用)
  19. 一年期早过:Windows 10免费升级漏洞仍然敞开着
  20. php librtmp,使用librtmp进行H264与AAC直播

热门文章

  1. Android SharedPreferences 详解 源码解析
  2. Android stadio bug
  3. python实现二分法查找_python3 二分法查找
  4. redis哨兵机制在集群中的应用
  5. 聚合Aggregation与合成Composition
  6. ios开发学习笔记--Core Motion
  7. The role of the inter-controller consensus in the placement of distributed SDN controllers
  8. zstack快速安装文档
  9. JS 正则匹配字符串
  10. 最大熵模型(Maximum Etropy)—— 熵,条件熵,联合熵,相对熵,互信息及其关系,最大熵模型。。...