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


79

我想找出我在以下提交中添加了以下代码:

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

我该如何实现?

Answers:


76

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,然后是名称,然后是日期,时间,时区,最后是行号和行内容。


21
问题在于,这仅显示那些文件的上次更改时间,而不显示它们的添加时间。
ensonic

@ensonic如果是这样的话,这个答案可能很有趣(例如,行已移动或空格更改):stackoverflow.com/a/5816177/812680
mcls

3
有用的附加功能是重复结果git blame test.txt | grep 'First line'
乔纳森·洛克利

3
那没有回答OP的问题。我们遇到了一个问题,我们所有的存储库都经历了“重新缩进代码”更改,将制表符从4个空格缩小到2个。从那一刻起,所有git怪总是会透露重新缩进代码的人-而不是介绍它的一位。git log -S可以解决问题。
Motti Shneor '18

77
git log -S searchTerm

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


6
我认为这是最好的答案,因为OP想要搜索添加的一些代码(而非文件)。
dr_18年

我同意-我遇到了一个问题,所有存储库都经过“重新缩进代码”会话,将制表符从4个空格缩小到2个空格。 -不是介绍它的人。git log -S可以解决问题。
Motti Shneor '18

42

比在整个文件上发怪要快得多。如果该行是${lineno}并且文件是${filename},则可以:

git blame -L ${lineno},${lineno} ${filename}

例:

git blame -L 2,2 test.txt

5
这实际上并不能回答问题-除非该行代码从未更改过。它将显示谁是最后更改这些代码行的用户。不是介绍他们的人。git log -S将,但是。但是,有用的技术...
Motti Shneor

20
git log -S "mention here line of code" [file-path]    

例如:

git log -S "First line" test.txt         

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


对不起,我听不懂-应该在“提及此处的代码行”中添加什么。行号?实际的行内容?要搜索的文字?你能说清楚点吗?
Motti Shneor '18

1
好。我用了它,我对结果感到惊讶。这个生命的节省者。真。在我们笨拙而糟糕的公司存储库中,一些明智的人决定将120万行代码中的制表符间距从4更改为2。当然,从那一刻起-git blame是没有意义的-因为每一个该死的行都因为重新缩进源代码而变得同样讨厌。所以-这确实给了我我所需要的绳索-查找谁“发明”了一行代码,而不是最后一个更改它的人。谢谢。大手
Motti Shneor '18

感谢您的赞赏。
anshul

1
在Linux终端中,代码行需要用单引号引起来:git log -S 'some code' path/to/file.c
Daniel Holmes,

这是救命稻草!谢谢!
赛义夫·法拉赫

0

如果代码在代码Git库中维护,intellijIDE和Git插件一起用于浏览代码,那么我发现以下方法非常直观:

  1. 在打开文件 intellij
  2. 转到上下文菜单-> Git->注释。
  3. 新窗口将出现在新窗口中的每一行告诉谁提交该行的位置。

以下屏幕截图仅供参考:

在此处输入图片说明

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.