如何找出添加特定代码的提交?

Har*_*iya 56 git git-commit

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

if (getListView().getChildCount() == 0)
                getActivity().findViewById(android.R.id.empty).setVisibility(View.VISIBLE);
Run Code Online (Sandbox Code Playgroud)

我该如何实现这一目标?

Rah*_*mad 57

git log -S searchTerm
Run Code Online (Sandbox Code Playgroud)

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

  • 我认为这是最好的答案,因为OP想要搜索添加的一些代码(而不是文件). (5认同)

Lei*_*igh 56

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

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

$ cat test.txt
First line.
Second line.
Run Code Online (Sandbox Code Playgroud)

运行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.
Run Code Online (Sandbox Code Playgroud)

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

  • 问题是,这只显示上次更改的文件,而不是添加时的文件. (15认同)
  • 有用的附加方法是grep结果`git blame test.txt |。grep'第一行'` (3认同)
  • 那没有回答OP的问题。我们遇到了一个问题,我们所有的存储库都经历了“重新缩进代码”更改,将制表符从4个空格缩小到2个。从那一刻起,所有git怪总是会透露重新缩进代码的人-而不是介绍它的一位。git log -S可以解决问题。 (2认同)

cfo*_*ish 40

有一些东西比在整个文件上发布指责更快.如果该行是${lineno},文件是${filename}你可以:

git blame -L ${lineno},${lineno} ${filename}
Run Code Online (Sandbox Code Playgroud)

例:

git blame -L 2,2 test.txt
Run Code Online (Sandbox Code Playgroud)

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

ans*_*hul 10

git log -S "mention here line of code" [file-path]    
Run Code Online (Sandbox Code Playgroud)

例如:

git log -S "First line" test.txt         
Run Code Online (Sandbox Code Playgroud)

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

  • 好的。我使用了它,我对结果感到惊讶。这是一个救星。真的。在我们相当笨拙和糟糕的公司存储库中,一些聪明人决定在 120 万行代码中将制表符间距从 4 更改为 2。当然,从那一刻起 - git blame 毫无意义 - 因为每条该死的行都被重新缩进源的同样令人讨厌的承诺所改变。所以 - 这真的给了我我需要的绳索 - 找到谁“发明”了一行代码,而不是最后一个修改它的人。谢谢你。大手。 (3认同)
  • 在 Linux 终端中,它的代码行需要单引号:`git log -S 'some code' path/to/file.c` (3认同)