'git blame'是做什么的?


314

我看到了很多有关使用方法的问题git blame,但我不太了解它们。

Blame在GitHub界面上的文件顶部看到一个按钮。单击它后,它在左侧栏上显示一些带有用户名的差异。这说明什么?

git blame除了GitHub之外,为什么还要实际使用?


66
如果也听起来“怪”,那么,怪你,您可以安装此脚本并git praise改为使用:) github.com/ansman/git-praise
Jon Kiparsky

7
它既不应该责备,也不应该赞美。它本质上是假设性的,应该是客观的。
pdvries

40
git objectively-determine-contributer只是没有相同的戒指。
Ritwik Bose

27
@RitwikBose或仅仅是git who
aktivb '19

Answers:


238

git-blame

使用来自上次修改该行的修订版的信息注释给定文件中的每一行。(可选)从给定的修订版本开始注释。

如果指定一次或多次,则-L将注释限制为所请求的行。

例:

johndoe@server.com:~# git blame .htaccess
...
^e1fb2d7 (John Doe 2015-07-03 06:30:25 -0300  4) allow from all
^72fgsdl (Arthur King 2015-07-03 06:34:12 -0300  5)
^e1fb2d7 (John Doe 2015-07-03 06:30:25 -0300  6) <IfModule mod_rewrite.c>
^72fgsdl (Arthur King 2015-07-03 06:34:12 -0300  7)     RewriteEngine On
...

请注意,git blame按时间顺序未显示每行的修改历史记录。它仅显示谁是最后一次在文档中更改行的人HEAD

也就是说,为了查看文档行的完整历史记录/日志,您需要git blame path/to/file为中的每个提交运行一个git log


1
所以只是为了看到最后一个人?
特·埃德姆·萨欣(RıfatErdem Sahin),

2
是的,它使您可以看到更改线路的最后一个人。
标记

@Mark因此,当我们在IDE上进行注释时,它会在内部发出git blame命令?
Nagarajan Shanmuganathan

2
@NagarajanShanmuganathan是的,如果您使用git,那么这就是幕后发生的事情。
标记

151

该命令说明得很好。这是为了找出哪个同事写了特定行或破坏了项目,因此您可以责怪他们:)


105
该命令实际上听起来像是您将通过运行它来指责某人。至少在我了解这篇文章之前,这就是我的感受。
Francisco C.

12
@FranciscoC。您正在寻找:github.com/jayphelps/git-blame-someone-else
DustWolf

2
@FranciscoC。等待什么,那不是完全可以做到吗,即让您责怪别人吗?
IanDess

16
@IanDess也许仅仅是语义,但git blame听起来似乎会产生一些持久的影响,类似于git commit,实际上它只是告诉您由谁进行了哪些更改。“责备”一词所带有的那种和负面含义,使命令听起来像您应该远离的东西,并导致诸如此类的问题寻求澄清。
Francisco C.18年

20
显然,它应该称为git praise
pfnuesel

75

从GitHub

blame命令是Git功能,旨在帮助您确定谁对文件进行了更改。

尽管它的名字听起来很消极,但git blame实际上是无害的。它的主要功能是指出谁更改了文件中的哪些行以及原因。它是识别代码更改的有用工具。

基本上,git-blame用于显示什么修订和作者最后修改了文件的每一行。就像检查文件的开发历史一样。


2
这对我来说似乎是多余的,您可以从提交日志中看到用户与提交和ID之间的区别。如果我在这里了解所有内容,那么它的持久性将比提交历史记录小。也许我缺少了一些东西,但似乎是通过公开羞辱来实施编码标准。
user1431356 '18

8
我想命令的名称是Linus特定幽默感的结果:)并不是用来羞辱任何人的:)它只是一个有趣的(或不)选择有用命令的名称。 :)
Mladen B.

2
@ user1431356-关键是您想要影响特定行的第一条日志。否则,您需要在日志中搜索特定的字符串。(这确实是一种可行的方法-在手册页中查找“ git log -S”。)
azernik '18

1
“怪”标题是在git之前已经存在多年的东西。只看svn的实现。它不是莱纳斯·托瓦尔兹(Linus Torvalds)的名字。
JackAce

“我想命令的名称是Linus特定幽默感的结果:)并不是用来侮辱任何人:)”大声笑……更像是Linus的个性,这意味着羞辱某人。
Sinaesthetic,

34

git blame命令用于了解谁/哪个提交负责文件的最新更改。还可以看到每一行的作者/提交。

git blame filename (负责更改代码中的所有行)

git blame filename -L 0,10 (负责从“ 0”行到“ 10”行的更改)

怪罪还有许多其他选择,但通常这些可以有所帮助。


2

git blame命令与注释从最后修改就行了修订信息线,并...使用Git 2.22(Q2 2019),将这样做,因为一个性能修复围绕“ git blame”,尤其是在一个线性的历史(这是规范,我们应该进行优化)。

参见David Kastrup()的commit f892014(2019年4月2日(由Junio C Hamano合并--commit 4d8c4da中,2019年4月25日)fedelibregitster

blame.c:不要像往常一样掉落原点

当父Blob已经有排队的数据块排队时,在一个Blame步骤的末尾放下Blob将导致它立即重新加载,从而在处理线性历史记录时将I / O数量加倍并拆包。

将此类父Blob保留在内存中似乎是一个合理的优化,主要是在处理来自旧分支的合并时会产生额外的内存压力。


1

git blame命令用于逐行检查文件的内容,并查看每行的最后修改时间以及修改的作者。

如果代码中存在错误,请使用它来确定是谁造成的,然后可以怪他。吉特怪就是怪。

如果您需要了解一行代码的历史,请使用git log -S"code here",比git blame更简单。

git log vs git怪

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.