git责备怎么办?

Him*_*hra 252 git git-blame

我看到很多关于使用方法的问题,git blame但我并不真正了解它们.

blame在github界面上的文件顶部看到一个按钮.单击它后,它会在左侧栏上显示一些带有用户名的差异.这表明了什么?

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

Mar*_*ark 191

来自git-scm http://git-scm.com/docs/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
...
Run Code Online (Sandbox Code Playgroud)

请注意,git blame并未按时间顺序显示每行修改历史记录.它只显示谁是最后一个将文档中的行更改为最后一次提交的人HEAD.

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

  • 是的,它允许您查看最后更改线路的人。 (3认同)
  • @NagarajanShanmuganathan 是的,如果你使用 git 那么这就是幕后发生的事情。 (3认同)
  • 所以只是为了见最后一个人? (2认同)

小智 118

该命令解释得非常好,它是要弄清楚哪个同事写了特定的行或破坏了项目,所以你可以责怪他们:)

  • 该命令实际上听起来像你将通过运行它来指责某人.至少这是我在学习它在这篇文章中所做的事之前对我的反应. (86认同)
  • @IanDess也许它只是语义,但是`git blame`听起来好像会有一些持久效果,类似于`git commit`,实际上它只是告诉你谁做了什么改变.那个和"责备"一词所带来的负面含义,使命令听起来像你应该远离的东西,并导致像这样的问题寻求澄清. (13认同)
  • 显然,它应该被称为"git赞美". (13认同)
  • @FranciscoC.你正在寻找这个:https://github.com/jayphelps/git-blame-someone-else (8认同)
  • 鉴于 Linus 发现 Git 的定义非常有趣,并因此以 Git 的名字命名了该系统,因为他认为自己是一个系统,因此 Blame 可能被认为是完美的选择。https://en.wikipedia.org/wiki/Git_(slang) 和 https://www.pcworld.idg.com.au/article/129776/after_controversy_torvalds_begins_work_git_/ (4认同)
  • @弗朗西斯科。等等,这难道不是让你_责备_别人吗? (3认同)

Him*_*hra 65

来自GitHub https://help.github.com/articles/using-git-blame-to-trace-changes-in-a-file

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

尽管它的名字含糊不清,但git责备实际上是非常无害的; 它的主要功能是指出谁更改了文件中的哪些行以及原因.它可以是识别代码更改的有用工具.

基本上git-blame用于显示哪些修订版本和作者最后修改了文件的每一行.这就像检查文件开发的历史记录一样.

  • 我猜这个命令的名字是Linus特有的幽默感的结果:)它不是用来羞辱任何人:)它只是一个有趣的(或没有)选择一个有用的命令的名称:) (6认同)
  • “我猜这个命令的名字是 Linus 特有的幽默感的结果 :) 它不是用来羞辱任何人的 :)” 哈哈...更像是 Linus 的个性,它是为了羞辱某人。 (3认同)
  • 这对我来说似乎是多余的,你可以看到提交和提交日志中的用户ID之间的差异.如果我在这里理解一切,它的持久性比提交历史要少.也许我错过了一些东西,但似乎是通过公开羞辱来强制执行编码标准. (2认同)
  • @ user1431356-关键是您想要影响*特定行*的第一条日志行。否则,您需要在日志中搜索特定的字符串。(这确实是一种可行的方法-在手册页中查找“ git log -S”。) (2认同)
  • “责备”这个称呼在 git 出现之前就已经存在多年了。看看[svn的实现](http://svnbook.red-bean.com/en/1.8/svn.ref.svn.c.blame.html)。这不是 Linus Torvalds 的名字。 (2认同)

小智 29

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

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

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

还有很多其他选择,通常这些可能会有所帮助.


Jac*_*ine 14

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

如果代码中有错误,用它来识别是谁发现的,然后你就可以责怪他。Git 的责备就是受到责备(d)。

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

git log 与 git Blame


Von*_*onC 5

git blame命令使用最后修改该行的修订版中的信息来注释行,并且...使用 Git 2.22(2019 年第 2 季度),由于围绕“”的性能修复,尤其是在线性历史记录git blame(这是我们应该优化的规范)。

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

blame.c:不要那么急切地丢弃原始斑点

当父 blob 已经有排队等候指责的块时,在一个指责步骤结束时删除该 blob 将导致它立即重新加载,从而使处理线性历史记录时的 I/O 和解包量加倍。

将此类父 blob 保留在内存中似乎是一种合理的优化,在处理来自旧分支的合并时,通常会带来额外的内存压力。


在 Git 2.41(2023 年第 2 季度)之前,“ git blame --contents=<file> --``man<file>曾经是被禁止的,但现在它通过导致 的历史来查找从 content 开始的行的起源<rev>

请参阅Jacob Keller ( )提交的提交 1a3119e(2023 年 3 月 24 日)。(由Junio C Hamano 合并 -- --提交 62df03c中,2023 年 4 月 4 日)jacob-keller
gitster

blame:允许--contents使用非 HEAD 提交

签署人:雅各布·凯勒

--contents选项可以与( man )一起使用来责怪该文件,就好像它具有指定文件中的内容一样。 这类似于将内容复制到工作树中,然后运行 ​​gitblame。自1cfe773 起就支持此选项(:no rev 表示从工作树文件开始。,2007-01-30,Git v1.5.0-rc4 -- merge)(“ :no rev 表示从工作树文件开始。” )git blame

git-blamegit-blame

--contents选项总是指责该文件,就好像它基于当前的 HEAD 提交一样。
如果您在使用时尝试通过修订版--contents,您会收到以下错误:

fatal: cannot use --contents with final commit object name
Run Code Online (Sandbox Code Playgroud)

这是因为 Blame 进程会生成一个伪造的工作树提交,该提交始终使用 HEAD 对象作为其唯一父对象。

增强fake_working_tree_commit以获取用于父级的对象 ID,而不是始终使用 HEAD 对象。
然后,当我们提供内容时,总是生成一个假提交,即使我们有一个最终对象。
删除禁止检查--contents和最终修订。

请注意,当提供但未提供修订时,仍然会跳过生成假工作提交的行为--contents
在这种情况下生成这样的提交会将当前签出的文件内容与提供的修订结合起来,这会破坏正常的责备行为并产生意外的结果。

这使得可以使用--contents任意修订版,而不是强制使用本地 HEAD 提交。
这使得该--contents选项更加灵活,因为在使用 --contents 之前不再需要将工作树签出到所需的提交。

blame-options现在包含在其手册页中:

假设正在注释的文件有一个提交,其中包含指定文件的内容和 的父级<rev>,如果未<rev>指定,则默认为 HEAD。
您可以指定“ -”以使命令从标准输入读取文件内容。

git blame现在包含在其手册页中:

[ --contents <file> ] [<rev> | --reverse <rev>..<rev>] [--] <file>


仍然使用 Git 2.41(2023 年第 2 季度),输出由“git blame仍然使用 Git 2.41(2023 年第 2 季度),“ ” ( man )将一行归因于从选项指定的文件中获取的内容,--contents显示它与归因于工作树文件的行不同。

请参阅Jacob Keller ( )的提交 603d0fd(2023 年 4 月 24 日)。(由Junio C Hamano合并-- --jacob-keller
gitster提交 cf85f4b中,2023 年 5 月 2 日)

blame:对 --contents 生成的假提交使用不同的作者姓名

建议人: Junio C Hamano
建议人: Glen Choo
签署人: Jacob Keller

当该--contents选项与git blame选项与( man ),并且文件内容中的某些行无法通过所指责的历史记录进行注释时,用户将看到“尚未提交”的作者。
这类似于在没有修订的情况下进行指责时处理工作树内容的方式。

这有点令人困惑,因为这些数据不是工作副本,虽然从技术上讲它“尚未提交”,但它也来自外部文件。
将此作者姓名替换为“ External file (--contents)”,以更好地将此类行与实际工作副本行区分开来。

blame-options现在包含在其手册页中:

使用指定文件中的内容进行注释,<rev> 如果指定则从该文件开始,否则使用 HEAD。
您可以指定“-”以使命令从标准输入读取文件内容。