寻找在任何分支中引入string的Git提交

我想能够find任何分支中的任何提交中引入的某个string,我该怎么做? 我发现了一些(我修改为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> 

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

你可以做:

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

查找所有提交的添加或删除固定的string--all参数意味着从每个分支开始,并且 – 来源意味着显示哪些分支导致发现该提交。 添加-p来显示每个提交所引入的补丁程序通常很有用。

自1.7.4版本的git版本也有类似的-G选项,它需要一个正则expression式 。 这实际上有不同的(而且更明显的)语义,在Junio Hamano的博客文章中解释。

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

 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 

– 反向也是有帮助的,因为你需要第一次提交更改:

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

这种方式更老的承诺将首先出现。

Mark Longair的答案非常好,但是我发现这个更简单的版本可以为我工作。

 git log -S whatever 

乱七八糟的回答:

 $ git config --global alias.find '!git log --color -p -S ' 
  • 是需要的,因为其他方式,git不能正确地将parameter passing给-S。 看到这个回应
  • –color-p有助于准确显示“whatchanged”

现在你可以做了

 $ git find <whatever> 

要么

 $ git find <whatever> --all $ git find <whatever> master develop 
 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 

虽然这不能直接回答你的问题,但我认为这对你来说可能是一个很好的解决scheme。 我看到我的代码的一部分,这是不好的。 不知道是谁写的,什么时候写的。 我可以看到文件的所有更改,但很明显代码已经从其他文件移动到这个文件。 我想find谁是真正把它添加到首位。

为了做到这一点,我使用了Git bisect ,这让我很快find了罪人。

我跑了git bisect start ,然后git bisect bad ,因为检出的版本有问题。 因为我不知道问题何时发生,所以我针对“好”的第一个提交, git bisect good <initial sha>

然后我只是不停地search回购代码。 当我发现它的时候,我跑了git bisect bad ,当它不在时: git bisect good

在大约11个步骤中,我已经覆盖了大约1000次提交,并且find了引入问题的确切提交。 挺好的