如何找到在任何分支中引入字符串的Git提交?

时间:2011-04-28 08:59:00

标签: git search

我希望能够找到任何提交中引入的某个字符串 任何分支,我该怎么办?我发现了一些东西(我为Win32修改过), 但是git whatchanged似乎没有考虑不同的分支 (忽略py3k块,它只是一个msys / win换行修复)

git whatchanged -- <file> | \
grep "^commit " | \
python -c "exec(\"import sys,msvcrt,os\nmsvcrt.setmode(sys.stdout.fileno(), os.O_BINARY)\nfor l in sys.stdin: print(l.split()[1])\")" | \
xargs -i% git show origin % -- <file>

如果你的解决方案很慢,这并不重要。

7 个答案:

答案 0 :(得分:585)

你可以这样做:

git log -S <whatever> --source --all

查找添加或删除固定字符串 whatever的所有提交。 --all参数表示从每个分支开始,--source表示显示哪些分支导致查找该提交。添加-p以显示每个提交也会引入的补丁通常很有用。

自1.7.4以来的git版本也有类似的 -G选项,它采用正则表达式。这实际上有不同的(而且更明显的)语义,在this blog post from Junio Hamano中解释。

正如thameera在评论中指出的那样,如果搜索字词包含空格或其他特殊字符,则需要在搜索字词周围添加引号,例如:

git log -S 'hello world' --source --all
git log -S "dude, where's my car?" --source --all

以下是使用-G查找function foo() {的出现次数的示例:

git log -G "^(\s)*function foo[(][)](\s)*{$" --source --all

答案 1 :(得分:59)

- 反向也很有用,因为您需要第一次进行更改的提交:

git log --all -p --reverse --source -S 'needle'

这样,旧的提交将首先出现。

答案 2 :(得分:17)

Mark Longair’s answer非常好,但我发现这个更简单的版本适合我。

git log -S whatever

答案 3 :(得分:15)

用相同的答案搞清楚:

$ git config --global alias.find '!git log --color -p -S '
    需要
  • ,因为其他方式,git不能正确地将参数传递给-S。请参阅this response
  • - 颜色 -p 有助于准确显示“whatchanged”

现在你可以做到

$ git find <whatever>

$ git find <whatever> --all
$ git find <whatever> master develop

答案 4 :(得分:6)

git log -S"string_to_search" # options like --source --reverse --all etc

注意不要在S和“string_to_search”之间使用空格。在某些设置(git 1.7.1)中,您将收到如下错误:

fatal: ambiguous argument 'string_to_search': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions

答案 5 :(得分:2)

虽然这并没有直接回答你的问题,但我认为这对你来说可能是一个很好的解决方案。我看到了我的一部分代码,这很糟糕。不知道是谁写的或何时写的。我可以看到文件中的所有更改,但很明显代码已从其他文件移到此文件中。我想首先找到实际添加它的人。

要做到这一点,我使用了Git bisect,很快就让我找到了罪人。

我运行git bisect start然后git bisect bad,因为签出的修订版有问题。由于我不知道问题何时发生,我将第一次提交为“好”,git bisect good <initial sha>

然后我一直在搜索回购代码以查找错误的代码。当我找到它时,我运行git bisect bad,当它不存在时:git bisect good

在大约11个步骤中,我已经覆盖了~1000次提交并找到了确切的提交,其中引入了问题。太棒了。

答案 6 :(得分:1)

不确定为什么接受的答案在我的环境中不起作用,最后我在命令下运行以获取所需的信息

git log --pretty=format:"%h - %an, %ar : %s"|grep "STRING"