показать, какая ревизия и автор последний раз изменяли каждую строку файла (Show what revision and author last modified each line of a file)
Указание диапазонов (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. The -L
option, which limits annotation to a
range of lines, may be specified multiple times.
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