Git blame 故障排除

git blame命令是一个多功能的故障排除实用程序,具有很多的使用选项。git blame的高级功能是显示附加到文件中特定提交行的作者的元数据。通常用于检查文件历史的特定点,并获取有关上下文中修改该行的最后作者的信息。Git blame通常与 GUI 显示一起使用。

如何使用

为了演示git blame,我们需要一个有一些提交历史的仓库。我们将使用开源项目git-blame-example作为示例。这个开源项目是一个简单的仓库,其中包含一个 README.md 文件,并且包含不同作者的提交。

我们的第一步是使用git clone克隆仓库。

$ git clone https://kevzettler@bitbucket.org/kevzettler/git-blame-example.git && cd git-blame-example

现在我们有了示例代码的副本,我们可以开始使用git blame。首先我们使用git log 查看一下提交历史,如下所示:

$ git log
commit 548dabed82e4e5f3734c219d5a742b1c259926b2 (HEAD -> master, origin/master, origin/HEAD)
Author: Juni Mukherjee <jmukherjee@atlassian.com>
Date:   Thu Mar 1 19:55:15 2018 +0000

    Another commit to help git blame track the who, the what, and the when

commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
Author: Juni Mukherjee <jmukherjee@atlassian.com>
Date:   Thu Mar 1 19:53:23 2018 +0000

    Creating the third commit, along with Kev and Albert, so that Kev can get git blame docs.

commit 990c2b6a84464fee153253dbf02e845a4db372bb
Merge: 82496ea 89feb84
Author: Albert So <aso@atlassian.com>
Date:   Thu Mar 1 05:33:01 2018 +0000

    Merged in albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)

    README.md edited online with Bitbucket

commit 89feb84d885fe33d1182f2112885c2a64a4206ec

git blame仅对单个文件进行操作。该命令后面都需要跟上文件路径。下面我们查看README.md 文件

$ git blame README.md

输出如下内容

 82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  1) # Git Blame example
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  2)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  3) This repository is an example of a project with multiple contributors making commits.
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  4)
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  5) The repo use used elsewhere to demonstrate `git blame`
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  6)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  7) Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod TEMPOR incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  8)
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000  9) Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Creating a line to support documentation needs for git blame.
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)

这是 README.md 文件前 13 行的示例。为了更好地理解这个输出,让我们对其进行以下拆分。

ID 作者 时间戳 电话号码 行内容
89feb84d Albert So 2018-03-01 00:54:03 +0000 3 This repository is an example of a project with multiple contributors making commits.

常见选项

$ git blame -L 1,5 README.md

-L选项将指定显示的行的范围。在这里,我们输出第 1 行到第 5 行的信息。

git blame -e README.md

-e选项显示作者的电子邮件地址而不是用户名。

git blame -w README.md

-w选项忽略空格更改。如果以前的作者通过从制表符切换到空格或添加新行来修改文件的间距,不幸的是,这会通过显示这些更改来掩盖 git blame 的输出。

git blame -M README.md

-M选项检测同一文件中移动或复制的行。它将显示这些行的原始作者,而不是最后一个移动或复制这些行的作者。

git blame -C README.md

-C选项检测从其他文件移动或复制的行。它将显示这些行的原始作者,而不是最后一个移动或复制这些行的作者。

git blame 与 git log

虽然git blame显示每一行的最后修改的作者。但通常情况下,我们会想知道最初添加该行的时间。这时如果使用git blame命令的话,就需要组合-w,-C和-M选项。此时使用 git log 更方便。

要列出所有原始提交 - 其中添加或修改了特定代码段。使用 git log 命令,后面跟上-S选项。让我们以上面 README 输出中的其中一行作为示例。我们从 README 输出的第 12 行中获取文本“CSS3D and WebGL renderers”。

$ git log -S"CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
    e339d3c85 Mario Schuettel Tue Oct 13 16:51:06 2015 +0200 reverted README.md to original content
    509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Updated README
    cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

此输出向我们显示 README 中的内容被 3 个不同的作者添加或修改了 3 次。最初的提交是cb20237cc,作者为 Mr.doob

总结

git blame命令用于逐行检查文件的内容,并查看每行最后一次修改的时间以及修改的作者是谁。git blame可以使用各种命令行选项更改输出格式。git blame 和 git log 可以结合使用来发现文件内容的历史记录。

查看笔记

扫码一下
查看教程更方便