列出GIT历史记录中给定行号的所有版本

时间:2013-07-22 10:30:38

标签: git

Git是否可以按行号列出文件中给定行的所有先前版本?

我觉得它有用的原因是能够根据记录的堆栈跟踪报告更轻松地解决问题。

即。我在给定文件的第100行记录了undefined method exception。该文件包含在大量提交中,导致给定的行可能在文件中上下移动,即使没有对其进行任何更改。

如何在最后x次提交中打印出给定文件的第100行的内容?

7 个答案:

答案 0 :(得分:9)

这会调用git blame 每个有意义的修订,以显示文件$LINE的第$FILE行:

git log --format=format:%H $FILE | xargs -L 1 git blame $FILE -L $LINE,$LINE

与往常一样,责备显示每行开头的修订号。你可以追加

| sort | uniq -c

获取聚合结果,类似于更改此行的提交列表。 (不完全是,如果代码只是被移动了,这可能会为该行的不同内容显示两次相同的提交ID。对于更详细的分析,您必须对git blame结果进行滞后比较。相邻提交。任何人?)

答案 1 :(得分:7)

这并不是你要求的,但是使用git blame <file>,你可以看到最后修改每一行的提交。

第一列显示提交ID

$ git blame my-file.txt
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 1) Heading
c6e6d36d (David Pärsson 2013-07-22 12:53:10 +0200 2) =======
65126918 (David Pärsson 2013-07-22 12:53:02 +0200 3) 
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line

您可以通过提供修订,例如

来查看超出上次修改
$ git blame 8b3d2e15 my-file.txt

您还可以使用-L参数选择特定行,如下所示:

$ git blame my-file.txt -L 4,+3
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 4) Text on first line
8b3d2e15 (David Pärsson 2013-07-22 12:49:49 +0200 5) Text on second line
13e293e3 (David Pärsson 2013-07-22 12:49:33 +0200 6) Text on third line

可以在git-blame man page上找到更多细节和巧妙的技巧。

答案 2 :(得分:3)

查看这个简短的教程:http://zsoltfabok.com/blog/2012/02/git-blame-line-history/
基本上,它会引导您完成git blamegit show的组合,以查看哪些提交更改了特定行(git blame,特别是在David Parsson的回答中已经提出过)以及该行如何更改( git show <commit-id>)。因此,迭代提交交替git blame <commit-id> git show <commit-id>将为您提供文件特定行的完整历史记录。
此外,如果您怀疑该行已从另一个文件复制,请不要忘记git blame -M。来自https://www.kernel.org/pub/software/scm/git/docs/git-blame.html

  

-M | num |
      检测文件中移动或复制的行。当提交移动或复制一个行块时(例如,原始文件有A然后是B,并且提交将其更改为B然后A),传统的blame算法只注意到一半的移动并且通常归咎于向上移动(即B)到父母并将责任归咎于向下移动(即A)到子提交的行。使用此选项,通过运行额外的检查通道,两组行都会被指定为父组。

num 是可选的,但它是字母数字字符数的下限git必须在文件中检测为移动/复制,以便将这些行与父提交相关联。默认值为20.

答案 3 :(得分:2)

git blame <file> -L <line>,<line>

答案 4 :(得分:2)

实际上Git附带了一个花哨的GUI,它可以让您轻松地来回移动以查看特定线路的变化情况。尝试

git gui blame <file>

您可以点击“回到过去”链接旁边的修订版。

答案 5 :(得分:1)

我认为你在git blame之后,它告诉你添加每一行的提交。

所以运行git blame the-file-that-has-that-line.txt并转到第100行,它会告诉你添加了什么提交(以及提交时间和提交者)。

答案 6 :(得分:-2)

使用git blame来实现

看看它是否有效

NAME
       git-blame - Show what revision and author last modified each line of a file

SYNOPSIS
       git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L n,m]
                   [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>]
                   [<rev> | --contents <file> | --reverse <rev>] [--] <file>

DESCRIPTION
       Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.