如何找出在哪个提交中添加了特定代码?
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 -> 注释。
将出现新窗口,其中新窗口中的每一行都会告诉谁提交了该行。
以下截图仅供参考:
【讨论】:
以上是关于如何找出在哪个提交中添加了特定代码?的主要内容,如果未能解决你的问题,请参考以下文章