我希望能够找到任何分支中任何提交中引入的某个字符串,我该怎么做? 我发现了一些东西(我为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>
如果您的解决方案很慢,这并不重要。
#1楼
Mark Longair的答案非常好,但我发现这个更简单的版本适合我。
git log -S whatever
#2楼
用相同的答案搞清楚:
$ git config --global alias.find '!git log --color -p -S '
- ! 因为其他方式,git不能正确地将参数传递给-S。 看到这个回复
- --color和-p有助于准确显示“whatchanged”
现在你可以做到
$ git find <whatever>
要么
$ git find <whatever> --all
$ git find <whatever> master develop
#3楼
--reverse也很有帮助,因为您需要进行更改的第一个提交:
git log --all -p --reverse --source -S 'needle'
这样,旧的提交将首先出现。
#4楼
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楼
虽然这不能直接回答你的问题,但我认为这对你来说可能是一个很好的解决方案。 我看到了我的一部分代码,这很糟糕。 不知道是谁写的或何时写的。 我可以看到文件中的所有更改,但很明显代码已从其他文件移到此文件中。 我想找到谁首先实际添加它。
为此,我使用了Git bisect ,很快就让我找到了罪人。
我运行git bisect start
然后git bisect bad
,因为签出的修订版有问题。 由于我不知道问题何时发生,我将第一次提交为“好”, git bisect good <initial sha>
。
然后我一直在搜索回购代码以查找错误的代码。 当我找到它时,我运行了git bisect bad
,当它不存在时: git bisect good
。
在大约11个步骤中,我已经覆盖了~1000个提交并找到了确切的提交,其中引入了问题。 太棒了
来源:oschina
链接:https://my.oschina.net/u/3797416/blog/3169401