1git-blame(1) 2============ 3 4NAME 5---- 6git-blame - Show what revision and author last modified each line of a file 7 8SYNOPSIS 9-------- 10[verse] 11'git blame' [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental] 12 [-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>] 13 [--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>] 14 [--] <file> 15 16DESCRIPTION 17----------- 18 19Annotates each line in the given file with information from the revision which 20last modified the line. Optionally, start annotating from the given revision. 21 22When specified one or more times, `-L` restricts annotation to the requested 23lines. 24 25The origin of lines is automatically followed across whole-file 26renames (currently there is no option to turn the rename-following 27off). To follow lines moved from one file to another, or to follow 28lines that were copied and pasted from another file, etc., see the 29`-C` and `-M` options. 30 31The report does not tell you anything about lines which have been deleted or 32replaced; you need to use a tool such as 'git diff' or the "pickaxe" 33interface briefly mentioned in the following paragraph. 34 35Apart from supporting file annotation, Git also supports searching the 36development history for when a code snippet occurred in a change. This makes it 37possible to track when a code snippet was added to a file, moved or copied 38between files, and eventually deleted or replaced. It works by searching for 39a text string in the diff. A small example of the pickaxe interface 40that searches for `blame_usage`: 41 42----------------------------------------------------------------------------- 43$ git log --pretty=oneline -S'blame_usage' 445040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file> 45ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output 46----------------------------------------------------------------------------- 47 48OPTIONS 49------- 50include::blame-options.txt[] 51 52-c:: 53 Use the same output mode as linkgit:git-annotate[1] (Default: off). 54 55--score-debug:: 56 Include debugging information related to the movement of 57 lines between files (see `-C`) and lines moved within a 58 file (see `-M`). The first number listed is the score. 59 This is the number of alphanumeric characters detected 60 as having been moved between or within files. This must be above 61 a certain threshold for 'git blame' to consider those lines 62 of code to have been moved. 63 64-f:: 65--show-name:: 66 Show the filename in the original commit. By default 67 the filename is shown if there is any line that came from a 68 file with a different name, due to rename detection. 69 70-n:: 71--show-number:: 72 Show the line number in the original commit (Default: off). 73 74-s:: 75 Suppress the author name and timestamp from the output. 76 77-e:: 78--show-email:: 79 Show the author email instead of author name (Default: off). 80 This can also be controlled via the `blame.showEmail` config 81 option. 82 83-w:: 84 Ignore whitespace when comparing the parent's version and 85 the child's to find where the lines came from. 86 87--abbrev=<n>:: 88 Instead of using the default 7+1 hexadecimal digits as the 89 abbreviated object name, use <n>+1 digits. Note that 1 column 90 is used for a caret to mark the boundary commit. 91 92include::diff-heuristic-options.txt[] 93 94 95THE PORCELAIN FORMAT 96-------------------- 97 98In this format, each line is output after a header; the 99header at the minimum has the first line which has: 100 101- 40-byte SHA-1 of the commit the line is attributed to; 102- the line number of the line in the original file; 103- the line number of the line in the final file; 104- on a line that starts a group of lines from a different 105 commit than the previous one, the number of lines in this 106 group. On subsequent lines this field is absent. 107 108This header line is followed by the following information 109at least once for each commit: 110 111- the author name ("author"), email ("author-mail"), time 112 ("author-time"), and time zone ("author-tz"); similarly 113 for committer. 114- the filename in the commit that the line is attributed to. 115- the first line of the commit log message ("summary"). 116 117The contents of the actual line is output after the above 118header, prefixed by a TAB. This is to allow adding more 119header elements later. 120 121The porcelain format generally suppresses commit information that has 122already been seen. For example, two lines that are blamed to the same 123commit will both be shown, but the details for that commit will be shown 124only once. This is more efficient, but may require more state be kept by 125the reader. The `--line-porcelain` option can be used to output full 126commit information for each line, allowing simpler (but less efficient) 127usage like: 128 129 # count the number of lines attributed to each author 130 git blame --line-porcelain file | 131 sed -n 's/^author //p' | 132 sort | uniq -c | sort -rn 133 134 135SPECIFYING RANGES 136----------------- 137 138Unlike 'git blame' and 'git annotate' in older versions of git, the extent 139of the annotation can be limited to both line ranges and revision 140ranges. The `-L` option, which limits annotation to a range of lines, may be 141specified multiple times. 142 143When you are interested in finding the origin for 144lines 40-60 for file `foo`, you can use the `-L` option like so 145(they mean the same thing -- both ask for 21 lines starting at 146line 40): 147 148 git blame -L 40,60 foo 149 git blame -L 40,+21 foo 150 151Also you can use a regular expression to specify the line range: 152 153 git blame -L '/^sub hello {/,/^}$/' foo 154 155which limits the annotation to the body of the `hello` subroutine. 156 157When you are not interested in changes older than version 158v2.6.18, or changes older than 3 weeks, you can use revision 159range specifiers similar to 'git rev-list': 160 161 git blame v2.6.18.. -- foo 162 git blame --since=3.weeks -- foo 163 164When revision range specifiers are used to limit the annotation, 165lines that have not changed since the range boundary (either the 166commit v2.6.18 or the most recent commit that is more than 3 167weeks old in the above example) are blamed for that range 168boundary commit. 169 170A particularly useful way is to see if an added file has lines 171created by copy-and-paste from existing files. Sometimes this 172indicates that the developer was being sloppy and did not 173refactor the code properly. You can first find the commit that 174introduced the file with: 175 176 git log --diff-filter=A --pretty=short -- foo 177 178and then annotate the change between the commit and its 179parents, using `commit^!` notation: 180 181 git blame -C -C -f $commit^! -- foo 182 183 184INCREMENTAL OUTPUT 185------------------ 186 187When called with `--incremental` option, the command outputs the 188result as it is built. The output generally will talk about 189lines touched by more recent commits first (i.e. the lines will 190be annotated out of order) and is meant to be used by 191interactive viewers. 192 193The output format is similar to the Porcelain format, but it 194does not contain the actual lines from the file that is being 195annotated. 196 197. Each blame entry always starts with a line of: 198 199 <40-byte hex sha1> <sourceline> <resultline> <num_lines> 200+ 201Line numbers count from 1. 202 203. The first time that a commit shows up in the stream, it has various 204 other information about it printed out with a one-word tag at the 205 beginning of each line describing the extra commit information (author, 206 email, committer, dates, summary, etc.). 207 208. Unlike the Porcelain format, the filename information is always 209 given and terminates the entry: 210 211 "filename" <whitespace-quoted-filename-goes-here> 212+ 213and thus it is really quite easy to parse for some line- and word-oriented 214parser (which should be quite natural for most scripting languages). 215+ 216[NOTE] 217For people who do parsing: to make it more robust, just ignore any 218lines between the first and last one ("<sha1>" and "filename" lines) 219where you do not recognize the tag words (or care about that particular 220one) at the beginning of the "extended information" lines. That way, if 221there is ever added information (like the commit encoding or extended 222commit commentary), a blame viewer will not care. 223 224 225MAPPING AUTHORS 226--------------- 227 228include::mailmap.txt[] 229 230 231SEE ALSO 232-------- 233linkgit:git-annotate[1] 234 235GIT 236--- 237Part of the linkgit:git[1] suite