1 <?xml version=
"1.0" encoding=
"UTF-8"?>
2 <!DOCTYPE html PUBLIC
"-//W3C//DTD XHTML 1.1//EN"
3 "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
4 <html xmlns=
"http://www.w3.org/1999/xhtml" xml:
lang=
"en">
6 <meta http-equiv=
"Content-Type" content=
"application/xhtml+xml; charset=UTF-8" />
7 <meta name=
"generator" content=
"AsciiDoc 10.2.0" />
8 <title>git-blame(
1)
</title>
9 <style type=
"text/css">
10 /* Shared CSS for AsciiDoc xhtml11 and html5 backends */
14 font-family: Georgia,serif;
18 h1, h2, h3, h4, h5, h6,
19 div.title, caption.title,
20 thead, p.table.header,
22 #author, #revnumber, #revdate, #revremark,
24 font-family: Arial,Helvetica,sans-serif;
28 margin:
1em
5%
1em
5%;
33 text-decoration: underline;
49 h1, h2, h3, h4, h5, h6 {
57 border-bottom:
2px solid silver;
77 border:
1px solid silver;
88 ul
> li { color: #aaa; }
89 ul
> li
> * { color: black; }
91 .monospaced, code, pre {
92 font-family:
"Courier New", Courier, monospace;
99 white-space: pre-wrap;
109 #revnumber, #revdate, #revremark {
114 border-top:
2px solid silver;
120 padding-bottom:
0.5em;
124 padding-bottom:
0.5em;
129 margin-bottom:
1.5em;
131 div.imageblock, div.exampleblock, div.verseblock,
132 div.quoteblock, div.literalblock, div.listingblock, div.sidebarblock,
133 div.admonitionblock {
135 margin-bottom:
1.5em;
137 div.admonitionblock {
139 margin-bottom:
2.0em;
144 div.content { /* Block element content. */
148 /* Block element titles. */
149 div.title, caption.title {
154 margin-bottom:
0.5em;
160 td div.title:first-child {
163 div.content div.title:first-child {
166 div.content + div.title {
170 div.sidebarblock
> div.content {
172 border:
1px solid #dddddd;
173 border-left:
4px solid #f0f0f0;
177 div.listingblock
> div.content {
178 border:
1px solid #dddddd;
179 border-left:
5px solid #f0f0f0;
184 div.quoteblock, div.verseblock {
188 border-left:
5px solid #f0f0f0;
192 div.quoteblock
> div.attribution {
197 div.verseblock
> pre.content {
198 font-family: inherit;
201 div.verseblock
> div.attribution {
205 /* DEPRECATED: Pre version
8.2.7 verse style literal block. */
206 div.verseblock + div.attribution {
210 div.admonitionblock .icon {
214 text-decoration: underline;
216 padding-right:
0.5em;
218 div.admonitionblock td.content {
220 border-left:
3px solid #dddddd;
223 div.exampleblock
> div.content {
224 border-left:
3px solid #dddddd;
228 div.imageblock div.content { padding-left:
0; }
229 span.image img { border-style: none; vertical-align: text-bottom; }
230 a.image:visited { color: white; }
234 margin-bottom:
0.8em;
247 list-style-position: outside;
250 list-style-type: decimal;
253 list-style-type: lower-alpha;
256 list-style-type: upper-alpha;
259 list-style-type: lower-roman;
262 list-style-type: upper-roman;
265 div.compact ul, div.compact ol,
266 div.compact p, div.compact p,
267 div.compact div, div.compact div {
269 margin-bottom:
0.1em;
281 margin-bottom:
0.8em;
284 padding-bottom:
15px;
286 dt.hdlist1.strong, td.hdlist1.strong {
292 padding-right:
0.8em;
298 div.hdlist.compact tr {
307 .footnote, .footnoteref {
311 span.footnote, span.footnoteref {
312 vertical-align: super;
316 margin:
20px
0 20px
0;
320 #footnotes div.footnote {
326 border-top:
1px solid silver;
335 padding-right:
0.5em;
336 padding-bottom:
0.3em;
344 #footer-badges { display: none; }
348 margin-bottom:
2.5em;
356 margin-bottom:
0.1em;
359 div.toclevel0, div.toclevel1, div.toclevel2, div.toclevel3, div.toclevel4 {
376 span.aqua { color: aqua; }
377 span.black { color: black; }
378 span.blue { color: blue; }
379 span.fuchsia { color: fuchsia; }
380 span.gray { color: gray; }
381 span.green { color: green; }
382 span.lime { color: lime; }
383 span.maroon { color: maroon; }
384 span.navy { color: navy; }
385 span.olive { color: olive; }
386 span.purple { color: purple; }
387 span.red { color: red; }
388 span.silver { color: silver; }
389 span.teal { color: teal; }
390 span.white { color: white; }
391 span.yellow { color: yellow; }
393 span.aqua-background { background: aqua; }
394 span.black-background { background: black; }
395 span.blue-background { background: blue; }
396 span.fuchsia-background { background: fuchsia; }
397 span.gray-background { background: gray; }
398 span.green-background { background: green; }
399 span.lime-background { background: lime; }
400 span.maroon-background { background: maroon; }
401 span.navy-background { background: navy; }
402 span.olive-background { background: olive; }
403 span.purple-background { background: purple; }
404 span.red-background { background: red; }
405 span.silver-background { background: silver; }
406 span.teal-background { background: teal; }
407 span.white-background { background: white; }
408 span.yellow-background { background: yellow; }
410 span.big { font-size:
2em; }
411 span.small { font-size:
0.6em; }
413 span.underline { text-decoration: underline; }
414 span.overline { text-decoration: overline; }
415 span.line-through { text-decoration: line-through; }
417 div.unbreakable { page-break-inside: avoid; }
427 margin-bottom:
1.5em;
429 div.tableblock
> table {
430 border:
3px solid #
527bbd;
432 thead, p.table.header {
439 /* Because the table frame attribute is overridden by CSS in most browsers. */
440 div.tableblock
> table[
frame=
"void"] {
443 div.tableblock
> table[
frame=
"hsides"] {
444 border-left-style: none;
445 border-right-style: none;
447 div.tableblock
> table[
frame=
"vsides"] {
448 border-top-style: none;
449 border-bottom-style: none;
460 margin-bottom:
1.5em;
462 thead, p.tableblock.header {
473 border-color: #
527bbd;
474 border-collapse: collapse;
476 th.tableblock, td.tableblock {
480 border-color: #
527bbd;
483 table.tableblock.frame-topbot {
484 border-left-style: hidden;
485 border-right-style: hidden;
487 table.tableblock.frame-sides {
488 border-top-style: hidden;
489 border-bottom-style: hidden;
491 table.tableblock.frame-none {
492 border-style: hidden;
495 th.tableblock.halign-left, td.tableblock.halign-left {
498 th.tableblock.halign-center, td.tableblock.halign-center {
501 th.tableblock.halign-right, td.tableblock.halign-right {
505 th.tableblock.valign-top, td.tableblock.valign-top {
508 th.tableblock.valign-middle, td.tableblock.valign-middle {
509 vertical-align: middle;
511 th.tableblock.valign-bottom, td.tableblock.valign-bottom {
512 vertical-align: bottom;
523 padding-bottom:
0.5em;
524 border-top:
2px solid silver;
525 border-bottom:
2px solid silver;
530 body.manpage div.sectionbody {
535 body.manpage div#toc { display: none; }
540 <script type=
"text/javascript">
542 var asciidoc = { // Namespace.
544 /////////////////////////////////////////////////////////////////////
545 // Table Of Contents generator
546 /////////////////////////////////////////////////////////////////////
548 /* Author: Mihai Bazon, September
2002
549 * http://students.infoiasi.ro/~mishoo
551 * Table Of Content generator
554 * Feel free to use this script under the terms of the GNU General Public
555 * License, as long as you do not remove or alter this notice.
558 /* modified by Troy D. Hanson, September
2006. License: GPL */
559 /* modified by Stuart Rackham,
2006,
2009. License: GPL */
562 toc: function (toclevels) {
564 function getText(el) {
566 for (var i = el.firstChild; i != null; i = i.nextSibling) {
567 if (i.nodeType ==
3 /* Node.TEXT_NODE */) // IE doesn't speak constants.
569 else if (i.firstChild != null)
575 function TocEntry(el, text, toclevel) {
578 this.toclevel = toclevel;
581 function tocEntries(el, toclevels) {
582 var result = new Array;
583 var re = new RegExp('[hH]([
1-'+(toclevels+
1)+'])');
584 // Function that scans the DOM tree for header elements (the DOM2
585 // nodeIterator API would be a better technique but not supported by all
587 var iterate = function (el) {
588 for (var i = el.firstChild; i != null; i = i.nextSibling) {
589 if (i.nodeType ==
1 /* Node.ELEMENT_NODE */) {
590 var mo = re.exec(i.tagName);
591 if (mo && (i.getAttribute(
"class") || i.getAttribute(
"className")) !=
"float") {
592 result[result.length] = new TocEntry(i, getText(i), mo[
1]-
1);
602 var toc = document.getElementById(
"toc");
607 // Delete existing TOC entries in case we're reloading the TOC.
608 var tocEntriesToRemove = [];
610 for (i =
0; i < toc.childNodes.length; i++) {
611 var entry = toc.childNodes[i];
612 if (entry.nodeName.toLowerCase() == 'div'
613 && entry.getAttribute(
"class")
614 && entry.getAttribute(
"class").match(/^toclevel/))
615 tocEntriesToRemove.push(entry);
617 for (i =
0; i < tocEntriesToRemove.length; i++) {
618 toc.removeChild(tocEntriesToRemove[i]);
621 // Rebuild TOC entries.
622 var entries = tocEntries(document.getElementById(
"content"), toclevels);
623 for (var i =
0; i < entries.length; ++i) {
624 var entry = entries[i];
625 if (entry.element.id ==
"")
626 entry.element.id =
"_toc_" + i;
627 var a = document.createElement(
"a");
628 a.href =
"#" + entry.element.id;
629 a.appendChild(document.createTextNode(entry.text));
630 var div = document.createElement(
"div");
632 div.className =
"toclevel" + entry.toclevel;
633 toc.appendChild(div);
635 if (entries.length ==
0)
636 toc.parentNode.removeChild(toc);
640 /////////////////////////////////////////////////////////////////////
641 // Footnotes generator
642 /////////////////////////////////////////////////////////////////////
644 /* Based on footnote generation code from:
645 * http://www.brandspankingnew.net/archive/
2005/
07/format_footnote.html
648 footnotes: function () {
649 // Delete existing footnote entries in case we're reloading the footnodes.
651 var noteholder = document.getElementById(
"footnotes");
655 var entriesToRemove = [];
656 for (i =
0; i < noteholder.childNodes.length; i++) {
657 var entry = noteholder.childNodes[i];
658 if (entry.nodeName.toLowerCase() == 'div' && entry.getAttribute(
"class") ==
"footnote")
659 entriesToRemove.push(entry);
661 for (i =
0; i < entriesToRemove.length; i++) {
662 noteholder.removeChild(entriesToRemove[i]);
665 // Rebuild footnote entries.
666 var cont = document.getElementById(
"content");
667 var spans = cont.getElementsByTagName(
"span");
670 for (i=
0; i
<spans.length; i++) {
671 if (spans[i].className ==
"footnote") {
673 var note = spans[i].getAttribute(
"data-note");
675 // Use [\s\S] in place of . so multi-line matches work.
676 // Because JavaScript has no s (dotall) regex flag.
677 note = spans[i].innerHTML.match(/\s*\[([\s\S]*)]\s*/)[
1];
679 "[<a id='_footnoteref_" + n +
"' href='#_footnote_" + n +
680 "' title='View footnote' class='footnote'>" + n +
"</a>]";
681 spans[i].setAttribute(
"data-note", note);
683 noteholder.innerHTML +=
684 "<div class='footnote' id='_footnote_" + n +
"'>" +
685 "<a href='#_footnoteref_" + n +
"' title='Return to text'>" +
686 n +
"</a>. " + note +
"</div>";
687 var id =spans[i].getAttribute(
"id");
688 if (id != null) refs[
"#"+id] = n;
692 noteholder.parentNode.removeChild(noteholder);
694 // Process footnoterefs.
695 for (i=
0; i
<spans.length; i++) {
696 if (spans[i].className ==
"footnoteref") {
697 var href = spans[i].getElementsByTagName(
"a")[
0].getAttribute(
"href");
698 href = href.match(/#.*/)[
0]; // Because IE return full URL.
701 "[<a href='#_footnote_" + n +
702 "' title='View footnote' class='footnote'>" + n +
"</a>]";
708 install: function(toclevels) {
711 function reinstall() {
712 asciidoc.footnotes();
714 asciidoc.toc(toclevels);
718 function reinstallAndRemoveTimer() {
719 clearInterval(timerId);
723 timerId = setInterval(reinstall,
500);
724 if (document.addEventListener)
725 document.addEventListener(
"DOMContentLoaded", reinstallAndRemoveTimer, false);
727 window.onload = reinstallAndRemoveTimer;
735 <body class=
"manpage">
738 git-blame(
1) Manual Page
741 <div class=
"sectionbody">
743 Show what revision and author last modified each line of a file
749 <h2 id=
"_synopsis">SYNOPSIS
</h2>
750 <div class=
"sectionbody">
751 <div class=
"verseblock">
752 <pre class=
"content"><em>git blame
</em> [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
753 [-L
<range
>] [-S
<revs-file
>] [-M] [-C] [-C] [-C] [--since=
<date
>]
754 [--ignore-rev
<rev
>] [--ignore-revs-file
<file
>]
755 [--color-lines] [--color-by-age] [--progress] [--abbrev=
<n
>]
756 [ --contents
<file
> ] [
<rev
> | --reverse
<rev
>..
<rev
>] [--]
<file
></pre>
757 <div class=
"attribution">
762 <h2 id=
"_description">DESCRIPTION
</h2>
763 <div class=
"sectionbody">
764 <div class=
"paragraph"><p>Annotates each line in the given file with information from the revision which
765 last modified the line. Optionally, start annotating from the given revision.
</p></div>
766 <div class=
"paragraph"><p>When specified one or more times,
<code>-L
</code> restricts annotation to the requested
768 <div class=
"paragraph"><p>The origin of lines is automatically followed across whole-file
769 renames (currently there is no option to turn the rename-following
770 off). To follow lines moved from one file to another, or to follow
771 lines that were copied and pasted from another file, etc., see the
772 <code>-C
</code> and
<code>-M
</code> options.
</p></div>
773 <div class=
"paragraph"><p>The report does not tell you anything about lines which have been deleted or
774 replaced; you need to use a tool such as
<em>git diff
</em> or the
"pickaxe"
775 interface briefly mentioned in the following paragraph.
</p></div>
776 <div class=
"paragraph"><p>Apart from supporting file annotation, Git also supports searching the
777 development history for when a code snippet occurred in a change. This makes it
778 possible to track when a code snippet was added to a file, moved or copied
779 between files, and eventually deleted or replaced. It works by searching for
780 a text string in the diff. A small example of the pickaxe interface
781 that searches for
<code>blame_usage
</code>:
</p></div>
782 <div class=
"listingblock">
783 <div class=
"content">
784 <pre><code>$ git log --pretty=oneline -S'blame_usage'
785 5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S
<ancestry-file
>
786 ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output
</code></pre>
791 <h2 id=
"_options">OPTIONS
</h2>
792 <div class=
"sectionbody">
793 <div class=
"dlist"><dl>
799 Show blank SHA-
1 for boundary commits. This can also
800 be controlled via the
<code>blame.blankBoundary
</code> config option.
808 Do not treat root commits as boundaries. This can also be
809 controlled via the
<code>blame.showRoot
</code> config option.
817 Include additional statistics at the end of blame output.
821 -L
<start
>,
<end
>
828 Annotate only the line range given by
<em><start
>,
<end
></em>,
829 or by the function name regex
<em><funcname
></em>.
830 May be specified multiple times. Overlapping ranges are allowed.
832 <div class=
"paragraph"><p><em><start
></em> and
<em><end
></em> are optional.
<code>-L
<start
></code> or
<code>-L
<start
>,
</code> spans from
833 <em><start
></em> to end of file.
<code>-L ,
<end
></code> spans from start of file to
<em><end
></em>.
</p></div>
834 <div class=
"paragraph"><p><em><start
></em> and
<em><end
></em> can take one of these forms:
</p></div>
835 <div class=
"ulist"><ul>
840 <div class=
"paragraph"><p>If
<em><start
></em> or
<em><end
></em> is a number, it specifies an
841 absolute line number (lines count from
1).
</p></div>
847 <div class=
"paragraph"><p>This form will use the first line matching the given
848 POSIX regex. If
<em><start
></em> is a regex, it will search from the end of
849 the previous
<code>-L
</code> range, if any, otherwise from the start of file.
850 If
<em><start
></em> is
<code>^/regex/
</code>, it will search from the start of file.
851 If
<em><end
></em> is a regex, it will search
852 starting at the line given by
<em><start
></em>.
</p></div>
858 <div class=
"paragraph"><p>This is only valid for
<em><end
></em> and will specify a number
859 of lines before or after the line given by
<em><start
></em>.
</p></div>
862 <div class=
"paragraph"><p>If
<code>:
<funcname
></code> is given in place of
<em><start
></em> and
<em><end
></em>, it is a
863 regular expression that denotes the range from the first funcname line
864 that matches
<em><funcname
></em>, up to the next funcname line.
<code>:
<funcname
></code>
865 searches from the end of the previous
<code>-L
</code> range, if any, otherwise
866 from the start of file.
<code>^:
<funcname
></code> searches from the start of
867 file. The function names are determined in the same way as
<code>git diff
</code>
868 works out patch hunk headers (see
<em>Defining a custom hunk-header
</em>
869 in
<a href=
"gitattributes.html">gitattributes(
5)
</a>).
</p></div>
876 Show long rev (Default: off).
884 Show raw timestamp (Default: off).
892 Use revisions from revs-file instead of calling
<a href=
"git-rev-list.html">git-rev-list(
1)
</a>.
896 --reverse
<rev
>..
<rev
>
900 Walk history forward instead of backward. Instead of showing
901 the revision in which a line appeared, this shows the last
902 revision in which a line has existed. This requires a range of
903 revision like START..END where the path to blame exists in
904 START.
<code>git blame --reverse START
</code> is taken as
<code>git blame
905 --reverse START..HEAD
</code> for convenience.
913 Follow only the first parent commit upon seeing a merge
914 commit. This option can be used to determine when a line
915 was introduced to a particular integration branch, rather
916 than when it was introduced to the history overall.
927 Show in a format designed for machine consumption.
935 Show the porcelain format, but output commit information for
936 each line, not just the first time a commit is referenced.
945 Show the result incrementally in a format designed for
950 --encoding=
<encoding
>
954 Specifies the encoding used to output author names
955 and commit summaries. Setting it to
<code>none
</code> makes blame
956 output unconverted data. For more information see the
957 discussion about encoding in the
<a href=
"git-log.html">git-log(
1)
</a>
962 --contents
<file
>
966 Annotate using the contents from the named file, starting from
<rev
>
967 if it is specified, and HEAD otherwise. You may specify
<em>-
</em> to make
968 the command read from the standard input for the file contents.
972 --date
<format
>
976 Specifies the format used to output dates. If --date is not
977 provided, the value of the blame.date config variable is
978 used. If the blame.date config variable is also not set, the
979 iso format is used. For supported values, see the discussion
980 of the --date option at
<a href=
"git-log.html">git-log(
1)
</a>.
988 Progress status is reported on the standard error stream
989 by default when it is attached to a terminal. This flag
990 enables progress reporting even if not attached to a
991 terminal. Can
’t use
<code>--progress
</code> together with
<code>--porcelain
</code>
992 or
<code>--incremental
</code>.
1000 Detect moved or copied lines within a file. When a commit
1001 moves or copies a block of lines (e.g. the original file
1002 has A and then B, and the commit changes it to B and then
1003 A), the traditional
<em>blame
</em> algorithm notices only half of
1004 the movement and typically blames the lines that were moved
1005 up (i.e. B) to the parent and assigns blame to the lines that
1006 were moved down (i.e. A) to the child commit. With this
1007 option, both groups of lines are blamed on the parent by
1008 running extra passes of inspection.
1010 <div class=
"paragraph"><p><num
> is optional but it is the lower bound on the number of
1011 alphanumeric characters that Git must detect as moving/copying
1012 within a file for it to associate those lines with the parent
1013 commit. The default value is
20.
</p></div>
1015 <dt class=
"hdlist1">
1020 In addition to
<code>-M
</code>, detect lines moved or copied from other
1021 files that were modified in the same commit. This is
1022 useful when you reorganize your program and move code
1023 around across files. When this option is given twice,
1024 the command additionally looks for copies from other
1025 files in the commit that creates the file. When this
1026 option is given three times, the command additionally
1027 looks for copies from other files in any commit.
1029 <div class=
"paragraph"><p><num
> is optional but it is the lower bound on the number of
1030 alphanumeric characters that Git must detect as moving/copying
1031 between files for it to associate those lines with the parent
1032 commit. And the default value is
40. If there are more than one
1033 <code>-C
</code> options given, the
<num
> argument of the last
<code>-C
</code> will
1034 take effect.
</p></div>
1036 <dt class=
"hdlist1">
1037 --ignore-rev
<rev
>
1041 Ignore changes made by the revision when assigning blame, as if the
1042 change never happened. Lines that were changed or added by an ignored
1043 commit will be blamed on the previous commit that changed that line or
1044 nearby lines. This option may be specified multiple times to ignore
1045 more than one revision. If the
<code>blame.markIgnoredLines
</code> config option
1046 is set, then lines that were changed by an ignored commit and attributed to
1047 another commit will be marked with a
<code>?
</code> in the blame output. If the
1048 <code>blame.markUnblamableLines
</code> config option is set, then those lines touched
1049 by an ignored commit that we could not attribute to another revision are
1050 marked with a
<em>*
</em>.
1053 <dt class=
"hdlist1">
1054 --ignore-revs-file
<file
>
1058 Ignore revisions listed in
<code>file
</code>, which must be in the same format as an
1059 <code>fsck.skipList
</code>. This option may be repeated, and these files will be
1060 processed after any files specified with the
<code>blame.ignoreRevsFile
</code> config
1061 option. An empty file name,
<code>""</code>, will clear the list of revs from
1062 previously processed files.
1065 <dt class=
"hdlist1">
1070 Color line annotations in the default format differently if they come from
1071 the same commit as the preceding line. This makes it easier to distinguish
1072 code blocks introduced by different commits. The color defaults to cyan and
1073 can be adjusted using the
<code>color.blame.repeatedLines
</code> config option.
1076 <dt class=
"hdlist1">
1081 Color line annotations depending on the age of the line in the default format.
1082 The
<code>color.blame.highlightRecent
</code> config option controls what color is used for
1086 <dt class=
"hdlist1">
1094 <dt class=
"hdlist1">
1099 Use the same output mode as
<a href=
"git-annotate.html">git-annotate(
1)
</a> (Default: off).
1102 <dt class=
"hdlist1">
1107 Include debugging information related to the movement of
1108 lines between files (see
<code>-C
</code>) and lines moved within a
1109 file (see
<code>-M
</code>). The first number listed is the score.
1110 This is the number of alphanumeric characters detected
1111 as having been moved between or within files. This must be above
1112 a certain threshold for
<em>git blame
</em> to consider those lines
1113 of code to have been moved.
1116 <dt class=
"hdlist1">
1119 <dt class=
"hdlist1">
1124 Show the filename in the original commit. By default
1125 the filename is shown if there is any line that came from a
1126 file with a different name, due to rename detection.
1129 <dt class=
"hdlist1">
1132 <dt class=
"hdlist1">
1137 Show the line number in the original commit (Default: off).
1140 <dt class=
"hdlist1">
1145 Suppress the author name and timestamp from the output.
1148 <dt class=
"hdlist1">
1151 <dt class=
"hdlist1">
1156 Show the author email instead of the author name (Default: off).
1157 This can also be controlled via the
<code>blame.showEmail
</code> config
1161 <dt class=
"hdlist1">
1166 Ignore whitespace when comparing the parent
’s version and
1167 the child
’s to find where the lines came from.
1170 <dt class=
"hdlist1">
1175 Instead of using the default
7+
1 hexadecimal digits as the
1176 abbreviated object name, use
<m
>+
1 digits, where
<m
> is at
1177 least
<n
> but ensures the commit object names are unique.
1179 is used for a caret to mark the boundary commit.
1186 <h2 id=
"_the_default_format">THE DEFAULT FORMAT
</h2>
1187 <div class=
"sectionbody">
1188 <div class=
"paragraph"><p>When neither
<code>--porcelain
</code> nor
<code>--incremental
</code> option is specified,
1189 <code>git blame
</code> will output annotation for each line with:
</p></div>
1190 <div class=
"ulist"><ul>
1193 abbreviated object name for the commit the line came from;
1198 author ident (by default the author name and date, unless
<code>-s
</code> or
<code>-e
</code>
1208 <div class=
"paragraph"><p>before the line contents.
</p></div>
1212 <h2 id=
"_the_porcelain_format">THE PORCELAIN FORMAT
</h2>
1213 <div class=
"sectionbody">
1214 <div class=
"paragraph"><p>In this format, each line is output after a header; the
1215 header at the minimum has the first line which has:
</p></div>
1216 <div class=
"ulist"><ul>
1219 40-byte SHA-
1 of the commit the line is attributed to;
1224 the line number of the line in the original file;
1229 the line number of the line in the final file;
1234 on a line that starts a group of lines from a different
1235 commit than the previous one, the number of lines in this
1236 group. On subsequent lines this field is absent.
1240 <div class=
"paragraph"><p>This header line is followed by the following information
1241 at least once for each commit:
</p></div>
1242 <div class=
"ulist"><ul>
1245 the author name (
"author"), email (
"author-mail"), time
1246 (
"author-time"), and time zone (
"author-tz"); similarly
1252 the filename in the commit that the line is attributed to.
1257 the first line of the commit log message (
"summary").
1261 <div class=
"paragraph"><p>The contents of the actual line are output after the above
1262 header, prefixed by a TAB. This is to allow adding more
1263 header elements later.
</p></div>
1264 <div class=
"paragraph"><p>The porcelain format generally suppresses commit information that has
1265 already been seen. For example, two lines that are blamed to the same
1266 commit will both be shown, but the details for that commit will be shown
1267 only once. This is more efficient, but may require more state be kept by
1268 the reader. The
<code>--line-porcelain
</code> option can be used to output full
1269 commit information for each line, allowing simpler (but less efficient)
1270 usage like:
</p></div>
1271 <div class=
"literalblock">
1272 <div class=
"content">
1273 <pre><code># count the number of lines attributed to each author
1274 git blame --line-porcelain file |
1275 sed -n 's/^author //p' |
1276 sort | uniq -c | sort -rn
</code></pre>
1281 <h2 id=
"_specifying_ranges">SPECIFYING RANGES
</h2>
1282 <div class=
"sectionbody">
1283 <div class=
"paragraph"><p>Unlike
<em>git blame
</em> and
<em>git annotate
</em> in older versions of git, the extent
1284 of the annotation can be limited to both line ranges and revision
1285 ranges. The
<code>-L
</code> option, which limits annotation to a range of lines, may be
1286 specified multiple times.
</p></div>
1287 <div class=
"paragraph"><p>When you are interested in finding the origin for
1288 lines
40-
60 for file
<code>foo
</code>, you can use the
<code>-L
</code> option like so
1289 (they mean the same thing
 — both ask for
21 lines starting at
1291 <div class=
"literalblock">
1292 <div class=
"content">
1293 <pre><code>git blame -L
40,
60 foo
1294 git blame -L
40,+
21 foo
</code></pre>
1296 <div class=
"paragraph"><p>Also you can use a regular expression to specify the line range:
</p></div>
1297 <div class=
"literalblock">
1298 <div class=
"content">
1299 <pre><code>git blame -L '/^sub hello {/,/^}$/' foo
</code></pre>
1301 <div class=
"paragraph"><p>which limits the annotation to the body of the
<code>hello
</code> subroutine.
</p></div>
1302 <div class=
"paragraph"><p>When you are not interested in changes older than version
1303 v2.6
.18, or changes older than
3 weeks, you can use revision
1304 range specifiers similar to
<em>git rev-list
</em>:
</p></div>
1305 <div class=
"literalblock">
1306 <div class=
"content">
1307 <pre><code>git blame v2.6
.18.. -- foo
1308 git blame --since=
3.weeks -- foo
</code></pre>
1310 <div class=
"paragraph"><p>When revision range specifiers are used to limit the annotation,
1311 lines that have not changed since the range boundary (either the
1312 commit v2.6
.18 or the most recent commit that is more than
3
1313 weeks old in the above example) are blamed for that range
1314 boundary commit.
</p></div>
1315 <div class=
"paragraph"><p>A particularly useful way is to see if an added file has lines
1316 created by copy-and-paste from existing files. Sometimes this
1317 indicates that the developer was being sloppy and did not
1318 refactor the code properly. You can first find the commit that
1319 introduced the file with:
</p></div>
1320 <div class=
"literalblock">
1321 <div class=
"content">
1322 <pre><code>git log --diff-filter=A --pretty=short -- foo
</code></pre>
1324 <div class=
"paragraph"><p>and then annotate the change between the commit and its
1325 parents, using
<code>commit^!
</code> notation:
</p></div>
1326 <div class=
"literalblock">
1327 <div class=
"content">
1328 <pre><code>git blame -C -C -f $commit^! -- foo
</code></pre>
1333 <h2 id=
"_incremental_output">INCREMENTAL OUTPUT
</h2>
1334 <div class=
"sectionbody">
1335 <div class=
"paragraph"><p>When called with
<code>--incremental
</code> option, the command outputs the
1336 result as it is built. The output generally will talk about
1337 lines touched by more recent commits first (i.e. the lines will
1338 be annotated out of order) and is meant to be used by
1339 interactive viewers.
</p></div>
1340 <div class=
"paragraph"><p>The output format is similar to the Porcelain format, but it
1341 does not contain the actual lines from the file that is being
1342 annotated.
</p></div>
1343 <div class=
"olist arabic"><ol class=
"arabic">
1346 Each blame entry always starts with a line of:
1348 <div class=
"literalblock">
1349 <div class=
"content">
1350 <pre><code><40-byte-hex-sha1
> <sourceline
> <resultline
> <num-lines
></code></pre>
1352 <div class=
"paragraph"><p>Line numbers count from
1.
</p></div>
1356 The first time that a commit shows up in the stream, it has various
1357 other information about it printed out with a one-word tag at the
1358 beginning of each line describing the extra commit information (author,
1359 email, committer, dates, summary, etc.).
1364 Unlike the Porcelain format, the filename information is always
1365 given and terminates the entry:
1367 <div class=
"literalblock">
1368 <div class=
"content">
1369 <pre><code>"filename" <whitespace-quoted-filename-goes-here
></code></pre>
1371 <div class=
"paragraph"><p>and thus it is really quite easy to parse for some line- and word-oriented
1372 parser (which should be quite natural for most scripting languages).
</p></div>
1373 <div class=
"admonitionblock">
1376 <div class=
"title">Note
</div>
1378 <td class=
"content">For people who do parsing: to make it more robust, just ignore any
1379 lines between the first and last one (
"<sha1>" and
"filename" lines)
1380 where you do not recognize the tag words (or care about that particular
1381 one) at the beginning of the
"extended information" lines. That way, if
1382 there is ever added information (like the commit encoding or extended
1383 commit commentary), a blame viewer will not care.
</td>
1391 <h2 id=
"_mapping_authors">MAPPING AUTHORS
</h2>
1392 <div class=
"sectionbody">
1393 <div class=
"paragraph"><p>See
<a href=
"gitmailmap.html">gitmailmap(
5)
</a>.
</p></div>
1397 <h2 id=
"_configuration">CONFIGURATION
</h2>
1398 <div class=
"sectionbody">
1399 <div class=
"paragraph"><p>Everything below this line in this section is selectively included
1400 from the
<a href=
"git-config.html">git-config(
1)
</a> documentation. The content is the same
1401 as what
’s found there:
</p></div>
1402 <div class=
"dlist"><dl>
1403 <dt class=
"hdlist1">
1408 Show blank commit object name for boundary commits in
1409 <a href=
"git-blame.html">git-blame(
1)
</a>. This option defaults to false.
1412 <dt class=
"hdlist1">
1417 This determines the coloring scheme to be applied to blame
1418 output. It can be
<em>repeatedLines
</em>,
<em>highlightRecent
</em>,
1419 or
<em>none
</em> which is the default.
1422 <dt class=
"hdlist1">
1427 Specifies the format used to output dates in
<a href=
"git-blame.html">git-blame(
1)
</a>.
1428 If unset the iso format is used. For supported values,
1429 see the discussion of the
<code>--date
</code> option at
<a href=
"git-log.html">git-log(
1)
</a>.
1432 <dt class=
"hdlist1">
1437 Show the author email instead of author name in
<a href=
"git-blame.html">git-blame(
1)
</a>.
1438 This option defaults to false.
1441 <dt class=
"hdlist1">
1446 Do not treat root commits as boundaries in
<a href=
"git-blame.html">git-blame(
1)
</a>.
1447 This option defaults to false.
1450 <dt class=
"hdlist1">
1451 blame.ignoreRevsFile
1455 Ignore revisions listed in the file, one unabbreviated object name per
1456 line, in
<a href=
"git-blame.html">git-blame(
1)
</a>. Whitespace and comments beginning with
1457 <code>#
</code> are ignored. This option may be repeated multiple times. Empty
1458 file names will reset the list of ignored revisions. This option will
1459 be handled before the command line option
<code>--ignore-revs-file
</code>.
1462 <dt class=
"hdlist1">
1463 blame.markUnblamableLines
1467 Mark lines that were changed by an ignored revision that we could not
1468 attribute to another commit with a
<em>*
</em> in the output of
1469 <a href=
"git-blame.html">git-blame(
1)
</a>.
1472 <dt class=
"hdlist1">
1473 blame.markIgnoredLines
1477 Mark lines that were changed by an ignored revision that we attributed to
1478 another commit with a
<em>?
</em> in the output of
<a href=
"git-blame.html">git-blame(
1)
</a>.
1485 <h2 id=
"_see_also">SEE ALSO
</h2>
1486 <div class=
"sectionbody">
1487 <div class=
"paragraph"><p><a href=
"git-annotate.html">git-annotate(
1)
</a></p></div>
1491 <h2 id=
"_git">GIT
</h2>
1492 <div class=
"sectionbody">
1493 <div class=
"paragraph"><p>Part of the
<a href=
"git.html">git(
1)
</a> suite
</p></div>
1497 <div id=
"footnotes"><hr /></div>
1499 <div id=
"footer-text">
1501 2024-
02-
08 15:
45:
59 PST