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

﹥>﹥吖頭↗ 提交于 2020-02-27 02:02:35

我希望能够找到任何分支中任何提交中引入的某个字符串,我该怎么做? 我发现了一些东西(我为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个提交并找到了确切的提交,其中引入了问题。 太棒了

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!