blob: 9f23a861ce3a8dfd009532b469290cb6470b500d [file] [log] [blame]
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +01001git-blame(1)
2============
3
4NAME
5----
Jonas Fonseca26e8c5d2006-08-25 03:01:49 +02006git-blame - Show what revision and author last modified each line of a file
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +01007
8SYNOPSIS
9--------
Junio C Hamanoacca6872006-11-08 18:47:54 -080010[verse]
Thomas Rast13b8f682013-03-28 17:47:33 +010011'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
Eric Sunshine5bd9b792013-08-06 09:59:40 -040012 [-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>]
Thomas Rast13b8f682013-03-28 17:47:33 +010013 [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>] [--] <file>
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +010014
15DESCRIPTION
16-----------
Jonas Fonseca26e8c5d2006-08-25 03:01:49 +020017
18Annotates each line in the given file with information from the revision which
19last modified the line. Optionally, start annotating from the given revision.
20
Eric Sunshine5bd9b792013-08-06 09:59:40 -040021When specified one or more times, `-L` restricts annotation to the requested
22lines.
Junio C Hamanoacca6872006-11-08 18:47:54 -080023
Junio C Hamanoe5dce962012-09-21 12:09:42 -070024The origin of lines is automatically followed across whole-file
25renames (currently there is no option to turn the rename-following
26off). To follow lines moved from one file to another, or to follow
27lines that were copied and pasted from another file, etc., see the
28`-C` and `-M` options.
29
David J. Mellorb89510f2009-03-16 23:16:16 -070030The report does not tell you anything about lines which have been deleted or
Thomas Rast0b444cd2010-01-10 00:33:00 +010031replaced; you need to use a tool such as 'git diff' or the "pickaxe"
Jonas Fonseca26e8c5d2006-08-25 03:01:49 +020032interface briefly mentioned in the following paragraph.
33
Thomas Ackermann2de9b712013-01-21 20:17:53 +010034Apart from supporting file annotation, Git also supports searching the
René Scharfe23bfbb82007-01-17 16:32:41 +010035development history for when a code snippet occurred in a change. This makes it
Jonas Fonseca26e8c5d2006-08-25 03:01:49 +020036possible to track when a code snippet was added to a file, moved or copied
37between files, and eventually deleted or replaced. It works by searching for
Albert L. Lash, IV246090a2014-02-08 15:41:37 -050038a text string in the diff. A small example of the pickaxe interface
39that searches for `blame_usage`:
Jonas Fonseca26e8c5d2006-08-25 03:01:49 +020040
41-----------------------------------------------------------------------------
42$ git log --pretty=oneline -S'blame_usage'
435040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file>
44ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output
45-----------------------------------------------------------------------------
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +010046
47OPTIONS
48-------
Andrew Ruder635f4a32007-04-16 01:20:34 -050049include::blame-options.txt[]
50
51-c::
Dan McGee5162e692007-12-29 00:20:38 -060052 Use the same output mode as linkgit:git-annotate[1] (Default: off).
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +010053
Andrew Ruder635f4a32007-04-16 01:20:34 -050054--score-debug::
55 Include debugging information related to the movement of
56 lines between files (see `-C`) and lines moved within a
57 file (see `-M`). The first number listed is the score.
58 This is the number of alphanumeric characters detected
David J. Mellorb89510f2009-03-16 23:16:16 -070059 as having been moved between or within files. This must be above
Thomas Rast0b444cd2010-01-10 00:33:00 +010060 a certain threshold for 'git blame' to consider those lines
Andrew Ruder635f4a32007-04-16 01:20:34 -050061 of code to have been moved.
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +010062
Stephan Beyer32402402008-06-08 03:36:09 +020063-f::
64--show-name::
David J. Mellorb89510f2009-03-16 23:16:16 -070065 Show the filename in the original commit. By default
66 the filename is shown if there is any line that came from a
67 file with a different name, due to rename detection.
Junio C Hamanob24642b2006-10-12 00:44:27 -070068
Stephan Beyer32402402008-06-08 03:36:09 +020069-n::
70--show-number::
David J. Mellorb89510f2009-03-16 23:16:16 -070071 Show the line number in the original commit (Default: off).
Junio C Hamanob24642b2006-10-12 00:44:27 -070072
Junio C Hamano093dc5b2007-04-12 15:50:45 -070073-s::
David J. Mellorb89510f2009-03-16 23:16:16 -070074 Suppress the author name and timestamp from the output.
Junio C Hamano093dc5b2007-04-12 15:50:45 -070075
Kevin Ballard1b8cdce2010-10-15 23:57:51 -070076-e::
77--show-email::
78 Show the author email instead of author name (Default: off).
79
Junio C Hamanob82871b2007-06-09 18:14:56 -070080-w::
David J. Mellorb89510f2009-03-16 23:16:16 -070081 Ignore whitespace when comparing the parent's version and
82 the child's to find where the lines came from.
Junio C Hamanob82871b2007-06-09 18:14:56 -070083
Namhyung Kim84393bf2011-04-06 11:20:50 +090084--abbrev=<n>::
85 Instead of using the default 7+1 hexadecimal digits as the
86 abbreviated object name, use <n>+1 digits. Note that 1 column
87 is used for a caret to mark the boundary commit.
88
Junio C Hamanob82871b2007-06-09 18:14:56 -070089
Junio C Hamanob24642b2006-10-12 00:44:27 -070090THE PORCELAIN FORMAT
91--------------------
92
93In this format, each line is output after a header; the
René Scharfe23bfbb82007-01-17 16:32:41 +010094header at the minimum has the first line which has:
Junio C Hamanob24642b2006-10-12 00:44:27 -070095
96- 40-byte SHA-1 of the commit the line is attributed to;
97- the line number of the line in the original file;
98- the line number of the line in the final file;
David J. Mellorb89510f2009-03-16 23:16:16 -070099- on a line that starts a group of lines from a different
Junio C Hamanob24642b2006-10-12 00:44:27 -0700100 commit than the previous one, the number of lines in this
101 group. On subsequent lines this field is absent.
102
103This header line is followed by the following information
104at least once for each commit:
105
David J. Mellorb89510f2009-03-16 23:16:16 -0700106- the author name ("author"), email ("author-mail"), time
Jason St. John0ffa1542013-11-08 19:48:52 -0500107 ("author-time"), and time zone ("author-tz"); similarly
Junio C Hamanob24642b2006-10-12 00:44:27 -0700108 for committer.
David J. Mellorb89510f2009-03-16 23:16:16 -0700109- the filename in the commit that the line is attributed to.
Junio C Hamanob24642b2006-10-12 00:44:27 -0700110- the first line of the commit log message ("summary").
111
112The contents of the actual line is output after the above
113header, prefixed by a TAB. This is to allow adding more
114header elements later.
115
Jeff Kinged747dd2011-05-09 09:34:42 -0400116The porcelain format generally suppresses commit information that has
117already been seen. For example, two lines that are blamed to the same
118commit will both be shown, but the details for that commit will be shown
119only once. This is more efficient, but may require more state be kept by
120the reader. The `--line-porcelain` option can be used to output full
121commit information for each line, allowing simpler (but less efficient)
122usage like:
123
124 # count the number of lines attributed to each author
125 git blame --line-porcelain file |
126 sed -n 's/^author //p' |
127 sort | uniq -c | sort -rn
128
Junio C Hamanoacca6872006-11-08 18:47:54 -0800129
René Scharfe23bfbb82007-01-17 16:32:41 +0100130SPECIFYING RANGES
131-----------------
Junio C Hamanoacca6872006-11-08 18:47:54 -0800132
Thomas Rast0b444cd2010-01-10 00:33:00 +0100133Unlike 'git blame' and 'git annotate' in older versions of git, the extent
David J. Mellorb89510f2009-03-16 23:16:16 -0700134of the annotation can be limited to both line ranges and revision
Eric Sunshine5bd9b792013-08-06 09:59:40 -0400135ranges. The `-L` option, which limits annotation to a range of lines, may be
136specified multiple times.
137
138When you are interested in finding the origin for
David J. Mellorb89510f2009-03-16 23:16:16 -0700139lines 40-60 for file `foo`, you can use the `-L` option like so
Junio C Hamano42f62db2007-01-17 13:04:15 -0800140(they mean the same thing -- both ask for 21 lines starting at
141line 40):
Junio C Hamanoacca6872006-11-08 18:47:54 -0800142
143 git blame -L 40,60 foo
Junio C Hamano42f62db2007-01-17 13:04:15 -0800144 git blame -L 40,+21 foo
Junio C Hamanoacca6872006-11-08 18:47:54 -0800145
David J. Mellorb89510f2009-03-16 23:16:16 -0700146Also you can use a regular expression to specify the line range:
Junio C Hamano18d54532006-11-09 10:44:56 -0800147
148 git blame -L '/^sub hello {/,/^}$/' foo
149
David J. Mellorb89510f2009-03-16 23:16:16 -0700150which limits the annotation to the body of the `hello` subroutine.
Junio C Hamano18d54532006-11-09 10:44:56 -0800151
David J. Mellorb89510f2009-03-16 23:16:16 -0700152When you are not interested in changes older than version
Junio C Hamanoacca6872006-11-08 18:47:54 -0800153v2.6.18, or changes older than 3 weeks, you can use revision
Thomas Rast0b444cd2010-01-10 00:33:00 +0100154range specifiers similar to 'git rev-list':
Junio C Hamanoacca6872006-11-08 18:47:54 -0800155
156 git blame v2.6.18.. -- foo
157 git blame --since=3.weeks -- foo
158
159When revision range specifiers are used to limit the annotation,
160lines that have not changed since the range boundary (either the
161commit v2.6.18 or the most recent commit that is more than 3
162weeks old in the above example) are blamed for that range
163boundary commit.
164
David J. Mellorb89510f2009-03-16 23:16:16 -0700165A particularly useful way is to see if an added file has lines
Junio C Hamanoacca6872006-11-08 18:47:54 -0800166created by copy-and-paste from existing files. Sometimes this
167indicates that the developer was being sloppy and did not
168refactor the code properly. You can first find the commit that
169introduced the file with:
170
171 git log --diff-filter=A --pretty=short -- foo
172
173and then annotate the change between the commit and its
Jeff King6cf378f2012-04-26 04:51:57 -0400174parents, using `commit^!` notation:
Junio C Hamanoacca6872006-11-08 18:47:54 -0800175
176 git blame -C -C -f $commit^! -- foo
177
178
Junio C Hamano57e7a0a2007-01-28 12:21:53 -0800179INCREMENTAL OUTPUT
180------------------
181
182When called with `--incremental` option, the command outputs the
183result as it is built. The output generally will talk about
184lines touched by more recent commits first (i.e. the lines will
185be annotated out of order) and is meant to be used by
186interactive viewers.
187
188The output format is similar to the Porcelain format, but it
189does not contain the actual lines from the file that is being
190annotated.
191
192. Each blame entry always starts with a line of:
193
194 <40-byte hex sha1> <sourceline> <resultline> <num_lines>
195+
196Line numbers count from 1.
197
David J. Mellorb89510f2009-03-16 23:16:16 -0700198. The first time that a commit shows up in the stream, it has various
Junio C Hamano57e7a0a2007-01-28 12:21:53 -0800199 other information about it printed out with a one-word tag at the
David J. Mellorb89510f2009-03-16 23:16:16 -0700200 beginning of each line describing the extra commit information (author,
201 email, committer, dates, summary, etc.).
Junio C Hamano57e7a0a2007-01-28 12:21:53 -0800202
David J. Mellorb89510f2009-03-16 23:16:16 -0700203. Unlike the Porcelain format, the filename information is always
Junio C Hamano57e7a0a2007-01-28 12:21:53 -0800204 given and terminates the entry:
205
206 "filename" <whitespace-quoted-filename-goes-here>
207+
David J. Mellorb89510f2009-03-16 23:16:16 -0700208and thus it is really quite easy to parse for some line- and word-oriented
Junio C Hamano57e7a0a2007-01-28 12:21:53 -0800209parser (which should be quite natural for most scripting languages).
210+
211[NOTE]
212For people who do parsing: to make it more robust, just ignore any
David J. Mellorb89510f2009-03-16 23:16:16 -0700213lines between the first and last one ("<sha1>" and "filename" lines)
214where you do not recognize the tag words (or care about that particular
Junio C Hamano57e7a0a2007-01-28 12:21:53 -0800215one) at the beginning of the "extended information" lines. That way, if
216there is ever added information (like the commit encoding or extended
David J. Mellorb89510f2009-03-16 23:16:16 -0700217commit commentary), a blame viewer will not care.
Junio C Hamano57e7a0a2007-01-28 12:21:53 -0800218
219
Marius Storm-Olsen7d48e9e2009-02-08 15:34:31 +0100220MAPPING AUTHORS
221---------------
222
223include::mailmap.txt[]
224
225
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +0100226SEE ALSO
227--------
Dan McGee5162e692007-12-29 00:20:38 -0600228linkgit:git-annotate[1]
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +0100229
Jonas Fonseca8f2b72a2006-03-06 06:24:44 +0100230GIT
231---
Christian Couder9e1f0a82008-06-06 09:07:32 +0200232Part of the linkgit:git[1] suite