git blame使用

命令名称:

      git-blame - 显示文件的每一行最后修改的版本和作者

用法:

      git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] [-L n,m]

                  [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] [--abbrev=<n>]

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

描述

      在给定文件中的每一行中注释来自最后修改该行的修订者信息。可以选择从给定修订版本开始注释。

      该命令还可以限制注释的行范围。

      在整个文件重命名过程中自动跟踪行源(目前没有关闭重命名跟踪的选项)。要跟踪从一个文件移动到另一个文件的行,或要跟踪从另一个文件复制和粘贴的行,等等,请参见-C和-M选项。

      执行结果中不会展示已删除或替换的行;您需要使用以下工具获取,如git diff 或 “pickaxe”接口。

      除了支持文件注释之外,Git还支持搜索开发历史,以确定代码片段何时发生在更改中。这使得跟踪代码片段何时添加到文件中、何时在文件之间移动或复制、何时最终删除或替换成为可能。它通过在diff中搜索文本字符串来工作。例如

          $ git log --pretty=oneline -S'blame_usage'

          5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file>

          ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output

选项:

      -b

          为边界提交显示空白SHA-1。这也可以通过blame的blame.blankboundary选项来控制

      --root

          不要将root提交视为边界。这也可以通过blame的blame.showroot选项来控制

      --show-stats

          在blame输出的末尾包括附加统计数据。

      -L <start>,<end>

          只标注给定的行范围。 <start> 和 <end>采取形式:

          ·  数字

              如果 <start> 或 <end> 是数字的话,意味着从一个绝对行号开始(行号从1开始计算)

          ·  /正则表达式/

              这个形式将使用与给定的POSIX regex匹配的第一行。如果<end> 是正则, 它将从给出的<start>行开始搜索。

          ·  +offset or -offset

              仅支持 <end> 并且需要指定<start>给出的行之前或之后的行数。

      -l

          展示long rev (Default: off).

      -t

          展示 raw timestamp (Default: off).

      -S <revs-file>

          使用来自revs-file的修订,而不是调用git-rev-list(1)。

      --reverse

          让历史记录从以前向后展示。这里显示的不是一行出现的修订,而是一行存在的最后一个修订。This requires a range of revision like START..END where the path to blame exists in START.

      -p, --porcelain

          以供机器使用的格式显示。

      --line-porcelain

          显示瓷器格式,但是输出每一行的提交信息,而不仅仅是第一次引用提交--porcelain.

      --incremental

          以一种为机器使用而设计的格式递增地显示结果。

      --encoding=<encoding>

          指定用于输出作者名称和提交摘要的编码。将其设置为none将使blame输出无法转换为数据。有关更多信息,请参阅git-log(1)手册页中关于编码的讨论。

      --contents <file>

          当<rev>没有指定时,命令从工作树副本开始向后注释更改。此标志使命令假装工作树副本具有指定文件的内容(指定-使命令从标准输入中读取)。

      --date <format>

          该值是以下选项之一: {relative,local,default,iso,rfc,short}. 如果--date没有在blame中提供,将使用 blame.date变量。如果 blame.date变量也没有设置,将使用iso格式。有关更多信息,请参见git-log(1)中关于--date选项的讨论。

      -M|<num>|

          Detect moved or copied lines within a file. When a commit moves or copies a block of lines (e.g. the original file has A and then B, and the commit changes it to B and then A), the traditional blame algorithm notices only half of the movement and typically blames the lines that were moved up (i.e. B) to the parent and assigns blame to the lines that were moved down (i.e. A) to the child commit. With this option, both groups of lines are blamed on the parent by running extra passes of inspection.

          <num> is optional but it is the lower bound on the number of alphanumeric characters that Git must detect as moving/copying within a file for it to associate those lines with the parent commit. The default value is 20.

      -C|<num>|

          In addition to -M, detect lines moved or copied from other files that were modified in the same commit. This is useful when you reorganize your program and move code around across files. When this option is given twice,

          the command additionally looks for copies from other files in the commit that creates the file. When this option is given three times, the command additionally looks for copies from other files in any commit.

          <num> is optional but it is the lower bound on the number of alphanumeric characters that Git must detect as moving/copying between files for it to associate those lines with the parent commit. And the default value is

          40. If there are more than one -C options given, the <num> argument of the last -C will take effect.

      -h

          Show help message.

      -c

          Use the same output mode as git-annotate(1) (Default: off).

      --score-debug

          Include debugging information related to the movement of lines between files (see -C) and lines moved within a file (see -M). The first number listed is the score. This is the number of alphanumeric characters detected as

          having been moved between or within files. This must be above a certain threshold for git blame to consider those lines of code to have been moved.

      -f, --show-name

          在原始提交中显示文件名。默认情况下,如果有来自不同名称的文件的任何行(由于重命名检测),则显示文件名。

      -n, --show-number

          显示原始提交中的行号(默认值:off)。

      -s

          从输出中取消作者名和时间戳。

      -e, --show-email

          显示作者的电子邮件而不是作者的名字(默认off)。

      -w

          在比较父版本和子版本时,忽略空格以查找行来自何处。

      --abbrev=<n>

          Instead of using the default 7+1 hexadecimal digits as the abbreviated object name, use <n>+1 digits. Note that 1 column is used for a caret to mark the boundary commit.

THE PORCELAIN FORMAT

      In this format, each line is output after a header; the header at the minimum has the first line which has:

      ·  40-byte SHA-1 of the commit the line is attributed to;

      ·  the line number of the line in the original file;

      ·  the line number of the line in the final file;

      ·  on a line that starts a group of lines from a different commit than the previous one, the number of lines in this group. On subsequent lines this field is absent.

      This header line is followed by the following information at least once for each commit:

      ·  the author name ("author"), email ("author-mail"), time ("author-time"), and timezone ("author-tz"); similarly for committer.

      ·  the filename in the commit that the line is attributed to.

      ·  the first line of the commit log message ("summary").

      The contents of the actual line is output after the above header, prefixed by a TAB. This is to allow adding more header elements later.

      The porcelain format generally suppresses commit information that has already been seen. For example, two lines that are blamed to the same commit will both be shown, but the details for that commit will be shown only once.

      This is more efficient, but may require more state be kept by the reader. The --line-porcelain option can be used to output full commit information for each line, allowing simpler (but less efficient) usage like:

          # count the number of lines attributed to each author

          git blame --line-porcelain file |

          sed -n 's/^author //p' |

          sort | uniq -c | sort -rn

SPECIFYING RANGES

      Unlike git blame and git annotate in older versions of git, the extent of the annotation can be limited to both line ranges and revision ranges. When you are interested in finding the origin for lines 40-60 for file foo, you

      can use the -L option like so (they mean the same thing — both ask for 21 lines starting at line 40):

          git blame -L 40,60 foo

          git blame -L 40,+21 foo

      Also you can use a regular expression to specify the line range:

          git blame -L '/^sub hello {/,/^}$/' foo

      which limits the annotation to the body of the hello subroutine.

      When you are not interested in changes older than version v2.6.18, or changes older than 3 weeks, you can use revision range specifiers similar to git rev-list:

          git blame v2.6.18.. -- foo

          git blame --since=3.weeks -- foo

      When revision range specifiers are used to limit the annotation, lines that have not changed since the range boundary (either the commit v2.6.18 or the most recent commit that is more than 3 weeks old in the above example)

      are blamed for that range boundary commit.

      A particularly useful way is to see if an added file has lines created by copy-and-paste from existing files. Sometimes this indicates that the developer was being sloppy and did not refactor the code properly. You can first

      find the commit that introduced the file with:

          git log --diff-filter=A --pretty=short -- foo

      and then annotate the change between the commit and its parents, using commit^! notation:

          git blame -C -C -f $commit^! -- foo

INCREMENTAL OUTPUT

      When called with --incremental option, the command outputs the result as it is built. The output generally will talk about lines touched by more recent commits first (i.e. the lines will be annotated out of order) and is

      meant to be used by interactive viewers.

      The output format is similar to the Porcelain format, but it does not contain the actual lines from the file that is being annotated.

        1. Each blame entry always starts with a line of:

              <40-byte hex sha1> <sourceline> <resultline> <num_lines>

          Line numbers count from 1.

        2. The first time that a commit shows up in the stream, it has various other information about it printed out with a one-word tag at the beginning of each line describing the extra commit information (author, email,

          committer, dates, summary, etc.).

        3. Unlike the Porcelain format, the filename information is always given and terminates the entry:

              "filename" <whitespace-quoted-filename-goes-here>

          and thus it is really quite easy to parse for some line- and word-oriented parser (which should be quite natural for most scripting languages).

              Note

              For people who do parsing: to make it more robust, just ignore any lines between the first and last one ("<sha1>" and "filename" lines) where you do not recognize the tag words (or care about that particular one) at

              the beginning of the "extended information" lines. That way, if there is ever added information (like the commit encoding or extended commit commentary), a blame viewer will not care.

MAPPING AUTHORS

      If the file .mailmap exists at the toplevel of the repository, or at the location pointed to by the mailmap.file or mailmap.blob configuration options, it is used to map author and committer names and email addresses to

      canonical real names and email addresses.

      In the simple form, each line in the file consists of the canonical real name of an author, whitespace, and an email address used in the commit (enclosed by < and >) to map to the name. For example:

          Proper Name <commit@email.xx>

      The more complex forms are:

          <proper@email.xx> <commit@email.xx>

      which allows mailmap to replace only the email part of a commit, and:

          Proper Name <proper@email.xx> <commit@email.xx>

      which allows mailmap to replace both the name and the email of a commit matching the specified commit email address, and:

          Proper Name <proper@email.xx> Commit Name <commit@email.xx>

      which allows mailmap to replace both the name and the email of a commit matching both the specified commit name and email address.

      Example 1: Your history contains commits by two authors, Jane and Joe, whose names appear in the repository under several forms:

          Joe Developer <joe@example.com>

          Joe R. Developer <joe@example.com>

          Jane Doe <jane@example.com>

          Jane Doe <jane@laptop.(none)>

          Jane D. <jane@desktop.(none)>

      Now suppose that Joe wants his middle name initial used, and Jane prefers her family name fully spelled out. A proper .mailmap file would look like:

          Jane Doe        <jane@desktop.(none)>

          Joe R. Developer <joe@example.com>

      Note how there is no need for an entry for <jane@laptop.(none)>, because the real name of that author is already correct.

      Example 2: Your repository contains commits from the following authors:

          nick1 <bugs@company.xx>

          nick2 <bugs@company.xx>

          nick2 <nick2@company.xx>

          santa <me@company.xx>

          claus <me@company.xx>

          CTO <cto@coompany.xx>

      Then you might want a .mailmap file that looks like:

          <cto@company.xx>                      <cto@coompany.xx>

          Some Dude <some@dude.xx>        nick1 <bugs@company.xx>

          Other Author <other@author.xx>  nick2 <bugs@company.xx>

          Other Author <other@author.xx>        <nick2@company.xx>

          Santa Claus <santa.claus@northpole.xx> <me@company.xx>

      Use hash # for comments that are either on their own line, or after the email address.

SEE ALSO

      git-annotate(1)

GIT

      Part of the git(1) suite

Git 1.8.3.1                                                                                                    08/23/2017                                                                                                  GIT-BLAME(1)

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,937评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,503评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,712评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,668评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,677评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,601评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,975评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,637评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,881评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,621评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,710评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,387评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,971评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,947评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,189评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,805评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,449评论 2 342

推荐阅读更多精彩内容