寻找在任何分支中引入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了引入问题的确切提交。 挺好的