我看到了很多关于使用git blame
的方法的问题,但我并不真正理解它们。
我在GitHub界面上的文件顶部看到一个Blame按钮。点击后,它会在左栏上显示一些用户名的差异。这说明了什么?
除了GitHub之外,为什么git blame
被实际使用?
来自git指责:
用上次修改该行的修订版中的信息注释给定文件中的每一行。(可选)从给定的修订开始注释。
当指定一次或多次时,-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 log
中的每个提交运行一个git blame path/to/file
。
这是为了找出哪位同事写了特定的行或破坏了项目,所以你可以责怪他们:)
来自GitHub:
指责命令是Git的一项功能,旨在帮助您确定谁对文件进行了更改。
尽管它的名字听起来很负面,但git指责实际上很漂亮无恶意的它的主要功能是指出谁改变了文件中的行,以及原因。它可以成为识别更改的有用工具在您的代码中。
基本上,git-blame
用于显示文件的每一行最后修改的版本和作者。这就像检查一个文件的开发历史。
git blame
命令用于知道谁/哪个提交负责对文件进行的最新更改。还可以看到每一行的作者/提交人。
git blame filename
(提交负责代码中所有行的更改)
git blame filename -L 0,10
(提交负责从第"0"行到第"10"行的更改)
指责还有很多其他选择,但总的来说,这些可能会有所帮助。
git blame
命令用于逐行检查文件的内容,查看每一行最后一次修改的时间以及修改的作者是谁。
如果代码中有错误,用它来确定是谁造成的,那么你可以责怪他。Git责备就是得到责备(d)。
如果您需要了解一行代码的历史记录,请使用git log -S"code here"
。这比指责更简单。
git log与git指责
git blame
命令使用上次修改行的修订版信息注释行,并且。。。使用Git 2.22(2019年第二季度),将更快地这样做,因为";CCD_ 14";,尤其是在线性历史中(这是我们应该优化的规范)。
参见David Kastrup提交的f892014(2019年4月2日)(fedelibre
)。(由Junio C Hamano合并——gitster
——提交4d8c4da,2019年4月25日)
blame.c
:不要那么急切地丢弃原点Blob当父blob已经有块排队等待指责时,在一个指责步骤结束时丢弃blob将导致它立即重新加载,从而使处理线性历史时的I/O和解包量增加一倍。
在内存中保留这样的父Blob似乎是一种合理的优化,主要是在处理来自旧分支的合并时,应该会产生额外的内存压力。
在Git 2.41(2023年第二季度)之前;CCD_ 18 CCD_(man)过去是被禁止的,但现在它通过导致<rev>
的历史找到了从<file>
内容开始的行的起源。
参见Jacob Keller(jacob-keller
)提交的1a319e(2023年3月24日)
(由Junio C Hamano合并——gitster
——于2023年4月4日提交62df03c)
blame
:允许--contents
使用非HEAD提交签字人:Jacob Keller
--contents
选项可与git blame
(man)一起使用,以指责文件,就好像它包含指定文件中的内容一样
这类似于将内容复制到工作树中,然后运行git责怪
此选项自1cfe773(git-blame
:no rev表示从工作树文件启动。,2007-01-30,Git v1.5.0-rc4--合并)("git-blame
:no rev:表示从工作树文件启动。")
--contents
选项总是指责文件,就好像它是基于当前HEAD提交一样
如果您在使用--contents
时试图通过修订,则会出现以下错误:fatal: cannot use --contents with final commit object name
这是因为指责过程生成了一个伪工作树提交,它总是使用HEAD对象作为其唯一的父对象。
增强
fake_working_tree_commit
以获取用于父对象的对象ID,而不是始终使用HEAD对象
然后,当我们提供了内容时,即使我们有最终对象,也总是生成一个伪提交
删除禁止--contents
和最终修订的复选框。注意,当提供了修订但没有提供
--contents
时,仍然跳过生成伪工作提交的行为
在这种情况下生成这样的提交会将当前签出的文件内容与提供的修订版结合起来,这会打破正常的指责行为,并产生意外的结果。这允许使用具有任意修订的
--contents
,而不是强制使用本地HEAD提交
这使得--contents
选项更加灵活,因为在使用--contents之前不再需要将工作树签出到所需的提交。
blame-options
现在在其手册页中包括:
假设要注释的文件具有提交来自命名文件的内容和CCD_ 38的父级,当未指定
<rev>
时,默认为HEAD
您可以指定"-
"使命令从标准读取文件内容的输入。
git blame
现在在其手册页中包括:
[ --contents <file> ] [<rev> | --reverse <rev>..<rev>] [--] <file>
仍然使用Git 2.41(2023年第二季度);CCD_ 43">(man)将一行属性化为从--contents
选项指定的文件中获取的内容,其显示方式与归属于工作树文件的行不同。
请参阅Jacob Keller(jacob-keller
)提交的603d0fd(2023年4月24日)
(由Junio C Hamano合并——gitster
——提交cf85f4b,2023年5月2日)
blame
:对--contents生成的伪提交使用不同的作者名称推荐人:Junio C Hamano
建议人:Glen Choo签字人:Jacob Keller
当
--contents
选项与git blame
(man)一起使用时,并且文件的内容具有不能被指责的历史注释的行,用户将看到"的作者;尚未承诺">
这类似于在没有修订的情况下指责时指责处理工作树内容的方式。这有点令人困惑,因为这些数据不是工作副本;尚未提交";,它也来自一个外部文件
将此作者名称替换为"CCD_ 50";以便更好地将这些行与实际工作复制行区分开来。
blame-options
现在在其手册页中包括:
使用命名文件中的内容进行注释,从
<rev>
开始如果指定了,则返回HEAD
您可以指定"-"从文件内容的标准输入读取的命令。