【问题标题】:What does 'git blame' do?'git 责备'有什么作用?
【发布时间】:2015-09-21 01:41:53
【问题描述】:

看到很多关于git blame的使用方法的问题,但我不是很懂。

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

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

【问题讨论】:

  • 如果“责备”听起来也是,好吧,怪你,你可以安装这个脚本并改用git praise :) github.com/ansman/git-praise
  • 不应该责备,也不应该表扬;它本质上是假设性的,应该是客观的。
  • git objectively-determine-contributer 只是没有相同的戒指。
  • @RitwikBose 或只是git who
  • 对于那些认为blame 是一个糟糕的选择的人,请回想一下where git came from

标签: git git-blame


【解决方案1】:

来自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 log 中的每个提交运行 git blame path/to/file

【讨论】:

  • 所以只是为了看到最后一个人?
  • 是的,它可以让你看到最后换行的人。
  • @Mark 那么当我们在 IDE 上注解时,它会在内部生成一个 git blame 命令?
  • @NagarajanShanmuganathan 是的,如果您使用 git,那么这就是幕后发生的事情。
【解决方案2】:

这是为了弄清楚哪个同事写了特定的行或破坏了项目,所以你可以责备他们:)

【讨论】:

  • 这个命令实际上听起来你会通过运行它来责备某人。至少在我了解它在这篇文章中的作用之前,我是这么认为的。
  • @FranciscoC。你正在寻找这个:github.com/jayphelps/git-blame-someone-else
  • @FranciscoC。等等,这不是让你责备别人吗?
  • @IanDess 也许这只是语义,但git blame 听起来好像会产生一些持久的效果,类似于git commit,实际上它只是告诉您谁做了哪些更改.这和“责备”这个词所带有的负面含义,使命令听起来像是你应该远离的东西,并导致像这样寻求澄清的问题。
  • 显然应该叫git praise
【解决方案3】:

From GitHub:

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

尽管它的名字听起来很负面,但 git blame 实际上很漂亮 无害的;它的主要功能是指出谁改变了哪个 文件中的行,以及为什么。它可以成为识别更改的有用工具 在你的代码中。

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

【讨论】:

  • 这对我来说似乎是多余的,您可以从提交日志中看到提交和用户 ID 之间的差异。如果我理解这里的一切,它的持久性比提交历史要少。也许我遗漏了一些东西,但这似乎是通过公开羞辱强制执行的编码标准。
  • 我猜这个命令的名字是 Linus 特有的幽默感的结果 :) 它不是用来羞辱任何人的 :) 它只是一个有趣的(或不是)选择一个有用的命令的名称:)
  • @user1431356 - 关键是您想要影响特定行的第一条日志行。否则,您需要在日志中搜索特定字符串。 (这确实是一种可行的方法 - 在手册页中查找“git log -S”。)
  • “责备”这个标题在 git 之前就已经存在多年了。看看svn's implementation。这不是 Linus Torvalds 起的名字。
  • "我猜这个命令的名字是 Linus 特有的幽默感的结果 :) 它不是用来羞辱任何人的 :)" 哈哈... 更像它是 Linus 的个性,它是为了羞辱某人。
【解决方案4】:

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

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

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

还有很多其他的责备选项,但通常这些可能会有所帮助。

【讨论】:

    【解决方案5】:

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

    如果代码中存在错误,请使用它来识别是谁造成的,然后你可以责怪他。 Git 责备是被责备(d)。

    如果你想知道一行代码的历史,使用git log -S"code here",比git blame简单。

    git log vs git blame

    【讨论】:

      【解决方案6】:

      git blame 命令使用上次修改该行的版本中的信息来注释行,并且......由于性能修复,使用 Git 2.22(2019 年第二季度)将这样做更快围绕“git blame”,尤其是在线性历史中(这是我们应该优化的标准)。

      请参阅commit f892014(2019 年 4 月 2 日)David Kastrup (fedelibre)(由 Junio C Hamano -- gitster -- 合并于 commit 4d8c4da,2019 年 4 月 25 日)

      blame.c: 不要急于丢弃原始 blob

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

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

      【讨论】:

        猜你喜欢
        • 2018-10-26
        • 2017-04-17
        • 2016-04-21
        • 2011-06-06
        • 2011-07-03
        • 2020-12-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多