如何找出在哪个提交中添加了特定代码?

Posted

技术标签:

【中文标题】如何找出在哪个提交中添加了特定代码?【英文标题】:How to find out in which commit a particular code was added? 【发布时间】:2013-11-21 09:50:38 【问题描述】:

我想知道我在哪个提交中添加了下面给出的代码:

if (getListView().getChildCount() == 0)
                getActivity().findViewById(android.R.id.empty).setVisibility(View.VISIBLE);

我如何做到这一点?

【问题讨论】:

【参考方案1】:
git log -S searchTerm

为您提供引入搜索词的提交。

【讨论】:

我认为这是最好的答案,因为 OP 想要搜索添加的一些代码(而不是文件)。 我同意 - 我遇到了一个问题,即所有存储库都经过“重新缩进代码”会话,将制表符从 4 个空格缩小到 2 个。从那一刻起,所有 git blame 将始终显示重新缩进代码的人——而不是介绍代码的人。 git log -S 可以解决问题。【参考方案2】:

在文件上运行git blame。它会向您显示每行的提交 ID、日期和时间以及提交者。然后只需复制提交标识符,您就可以在git log <commit>git show <commit> 中使用它。

例如,我有一个名为 test.txt 的文件,在不同的提交中添加了行:

$ cat test.txt
First line.
Second line.

运行git blame:

$ git blame test.txt
^410c3dd (Leigh 2013-11-09 12:00:00 1) First line.
2365eb7d (Leigh 2013-11-09 12:00:10 2) Second line.

第一位是提交ID,然后是名称,然后是日期、时间、时区,最后是行号和行内容。

【讨论】:

问题在于,这仅显示那些文件最后更改的时间,而不是添加的时间。 @ensonic 如果是这种情况,这个答案可能会很有趣(例如,行被移动,或者空格改变):***.com/a/5816177/812680 有用的附加是 grep 结果git blame test.txt | grep 'First line' 这没有回答 OP 的问题。我们遇到了一个问题,我们所有的存储库都经历了“重新缩进代码”更改,将制表符从 4 个空格缩小到 2 个。从那一刻起,所有 git blame 将始终显示重新缩进代码的人 - 而不是介绍它的人。 git log -S 可以解决问题。【参考方案3】:

有比对整个文件发出责备更快的方法。如果该行是$lineno,文件是$filename,您可以:

git blame -L $lineno,$lineno $filename

例子:

git blame -L 2,2 test.txt

【讨论】:

这实际上并不能回答问题——除非那行代码从未改变过。它将显示最后更改这些代码行的用户是谁。不是介绍他们的人。不过,git log -S 会。但是,有用的技术... 毫无疑问,正确的解决方案!【参考方案4】:
git log -S "mention here line of code" [file-path]    

例如:

git log -S "First line" test.txt         

提供文件名及其路径是显而易见的,因为大多数时候,我们想知道是谁在特定文件中引入了特定代码段。

【讨论】:

对不起,我不明白 - 应该在“提及这里的代码行”中添加什么。行号?实际的行内容?要搜索的文本?你能说清楚一点吗? 好的。我使用了它,我对结果感到惊讶。这是一个救生员。真的。在我们相当笨拙和糟糕的公司存储库中,一些聪明人决定在 120 万行代码中将制表符间距从 4 更改为 2。当然从那一刻起 - git blame 毫无意义 - 因为每条该死的行都被重新缩进源代码的同样讨厌的承诺改变了。所以 - 这真的给了我我需要的绳索 - 找到谁“发明”了一行代码,而不是最后一个改变它的人。谢谢。大手笔。 感谢您的欣赏。 在 Linux 终端中,代码行需要单引号:git log -S 'some code' path/to/file.c 这是救命稻草!谢谢!【参考方案5】:

如果代码在Git 存储库中维护,intellij IDE 以及 Git 插件用于浏览代码,那么我发现以下方式非常直观:

    打开intellij中的文件 转到上下文菜单 -> Git -> 注释。 将出现新窗口,其中新窗口中的每一行都会告诉谁提交了该行。

以下截图仅供参考:

【讨论】:

以上是关于如何找出在哪个提交中添加了特定代码?的主要内容,如果未能解决你的问题,请参考以下文章

在git中如何找出在特定标签之后添加了哪些文件?

如何查看特定提交应用于哪个版本的 Rails?

如何找出哪个 gem 具有特定的依赖关系?

如何找出哪个存储过程正在使用 SQL Server 中特定表的特定列?

如何找出代码中存在哪些特定的循环引用

如何找出哪个小计构成总和?