23

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

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

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

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

4

7 回答 7

10

这将要求git blame每个有意义的修订都显示$LINE文件行$FILE

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

像往常一样,blame 会在每行的开头显示修订号。你可以追加

| sort | uniq -c

要获得汇总结果,例如更改此行的提交列表。(不完全是,如果仅移动了代码,这可能会针对该行的不同内容显示相同的提交 ID 两次。要进行更详细的分析,您必须git blame对相邻提交的结果进行滞后比较。有人吗? )

于 2013-07-23T07:19:47.840 回答
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 手册页中找到。

于 2013-07-22T10:45:36.740 回答
3

也可以查看这个简短的教程:http: //zsoltfabok.com/blog/2012/02/git-blame-line-history/
基本上,它会指导您结合git blamegit show查看哪些提交更改了特定行(git blame,正如已经建议的那样,特别是在大卫帕森的回答中)以及该行如何变化(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 | 编号|
检测文件中移动或复制的行。当提交移动或复制一行行时(例如,原始文件有 A,然后是 B,而提交将其更改为 B,然后是 A),传统的责备算法只注意到一半的移动,并且通常归咎于那些行向上移动(即 B)到父级,并将责任分配给向下移动(即 A)到子提交的行。使用此选项,通过运行额外的检查通道将两组行归咎于父代。

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

于 2013-07-23T07:44:22.143 回答
2

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

于 2013-07-22T14:49:38.653 回答
2

实际上,Git 附带了一个精美的 GUI,它可以轻松地在时间上来回移动以查看特定行的变化情况。尝试

git gui blame <file>

您可以单击“时光倒流”链接旁边的修订。

于 2013-07-23T07:29:22.633 回答
1

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

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

于 2013-07-22T12:03:05.943 回答
-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.
于 2013-07-23T07:22:19.757 回答