我曾经删除过一个文件或文件中的一些代码。我可以在内容(而不是提交消息)中进行grep吗?

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

git log -p | grep <pattern>

然而,这不会立即返回提交哈希。我和吉特·格里普玩得不亦乐乎。


当前回答

gitlog可以是搜索所有分支中文本的更有效的方法,特别是如果有很多匹配项,并且您希望首先看到最近的(相关的)更改。

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

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

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

git branch -a --contains 8beeff00d

其他回答

场景:您使用IDE对代码进行了大清理。问题:IDE清理的比它应该清理的多,现在代码无法编译(缺少资源等)

解决方案:

git grep --cached "text_to_find"

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

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

Jeet的答案在PowerShell中有效。

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

下面显示了任何提交中包含密码的所有文件。

# Store intermediate result
$result = git grep -n "password" $(git rev-list --all)

# Display unique file names
$result | select -unique { $_ -replace "(^.*?:)|(:.*)", "" }

A.完整、唯一、排序的路径:

# Get all unique filepaths of files matching 'password'
# Source: https://stackoverflow.com/a/69714869/10830091
git rev-list --all | (
    while read revision; do
        git grep -F --files-with-matches 'password' $revision | cat | sed "s/[^:]*://"
    done
) | sort | uniq

B.唯一、排序的文件名(不是路径):

# Get all unique filenames matching 'password'
# Source: https://stackoverflow.com/a/69714869/10830091
git rev-list --all | (
    while read revision; do
        git grep -F --files-with-matches 'password' $revision | cat | sed "s/[^:]*://"
    done
) | xargs basename | sort | uniq

第二个命令对BFG很有用,因为它只接受文件名,而不接受相对/系统绝对路径。

在这里查看我的完整答案以了解更多解释。

在任何版本、任何文件(Unix/Linux)中搜索:

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

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

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

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

然后,您可以使用gitshow获取更多信息,如作者、日期和差异:

git show 6988bec26b1503d45eb0b2e8a4364afb87dde7af

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

要搜索代码:要搜索文件,请执行以下操作:当然,它还支持正则表达式:

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