我希望能够找到任何提交中引入的某个字符串
任何分支,我该怎么办?我发现了一些东西(我为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>
如果你的解决方案很慢,这并不重要。
答案 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 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"