IT系/リファレンス/Gitコマンド/git_blame

Last-modified: 2020-05-31 (日) 15:53:50

git blame

ファイルの変更履歴を確認するコマンド。

用例

  • 変更履歴を確認
    git blame hoge.txt
  • 変更履歴を確認(ファイル名も表示)
    git blame -f hoge.txt
  • 変更履歴を確認(著者とタイムスタンプを表示しない)
    git blame -s hoge.txt
  • 変更履歴を確認(ハッシュ値を短縮しないで表示する)
    git blame -l hoge.txt
  • 変更履歴を確認(空白を無視)
    git blame -w hoge.txt
  • 行番号で指定した範囲の各行がどのコミットのものか調べる
    # 5行目からファイルの末尾まで
    git blame -L 5 file.txt
    # ファイルの先頭から5行目まで
    git blame -L ,5 file.txt
    # 5行目から10行目まで
    git blame -L 5,10 file.txt
    # 5行目から3行
    git blame -L 5,+3 file.txt
    # 5行目までの3行
    git blame -L 5,-3 file.txt
  • 正規表現で指定した範囲の各行がどのコミットのものか調べる
    # /ABC/ にマッチする行から /DEF/ にマッチする行まで
    git blame -L /ABC/,/DEF/ file.txt
    # ファイルの先頭から /ABC/ にマッチする行まで
    git blame -L ,/ABC/ file.txt
    # /ABC/ にマッチする行からファイルの末尾まで
    git blame -L /ABC/ file.txt
  • 行の移動やコピーを見つけて、各行がどのコミットから来ているのか調べる
    git blame -M file.txt
  • ファイル間の行の移動やコピーを見つけて、各行がどのコミットから来ているのか調べる
    git blame -C -C file.txt

書式

git blame [options] <file>

公式によると以下の通り。

git blame [-c] [-b] [-l] [--root] [-t] [-f] [-n] [-s] [-e] [-p] [-w] [--incremental]
          [-L <range>] [-S <revs-file>] [-M] [-C] [-C] [-C] [--since=<date>]
          [--ignore-rev <rev>] [--ignore-revs-file <file>]
          [--progress] [--abbrev=<n>] [<rev> | --contents <file> | --reverse <rev>..<rev>]
          [--] <file>

options

-cUse the same output mode as git-annotate (Default: off).
-bShow blank SHA-1 for boundary commits. This can also be controlled via the blame.blankboundary config option.
-lShow long rev (Default: off).
--rootDo not treat root commits as boundaries. This can also be controlled via the blame.showRoot config option.
-t更日時をミリ秒表示とする(デフォルトはoff)
-f | --show-nameファイル名を表示。デフォルトでは、別の名前のファイルからの行がある場合は、ファイル名が表示される。
-n | --show-number行番号を表示(デフォルトはoff)
-sSuppress the author name and timestamp from the output.
-e | --show-email変更者名の代わりに変更者のメールアドレスを表示(デフォルトはoff)。blame.showEmailconfigオプションでも制御できる。
-p | --porcelainShow in a format designed for machine consumption.
-wIgnore whitespace when comparing the parent’s version and the child’s to find where the lines came from.
--incrementalShow the result incrementally in a format designed for machine consumption.
-L <range>-L <start>,<end> or -L :<funcname>. Annotate only the given line range. May be specified multiple times. Overlapping ranges are allowed. <start> and <end> are optional. “-L <start>” or “-L <start>,” spans from <start> to end of file. “-L ,<end>” spans from start of file to <end>. <start> and <end> can take one of these forms:
number : If <start> or <end> is a number, it specifies an absolute line number (lines count from 1).
/regex/ : This form will use the first line matching the given POSIX regex. If <start> is a regex, it will search from the end of the previous -L range, if any, otherwise from the start of file. If <start> is “^/regex/”, it will search from the start of file. If <end> is a regex, it will search starting at the line given by <start>.
+offset or -offset : This is only valid for <end> and will specify a number of lines before or after the line given by <start>.

If “:<funcname>” is given in place of <start> and <end>, it is a regular expression that denotes the range from the first funcname line that matches <funcname>, up to the next funcname line. “:<funcname>” searches from the end of the previous -L range, if any, otherwise from the start of file. “^:<funcname>” searches from the start of file.
-S <revs-file>Use revisions from revs-file instead of calling git-rev-list.
-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.
--since=<date>期間指定。<date>以降のリビジョンを対象とする。
--ignore-rev <rev>Ignore changes made by the revision when assigning blame, as if the change never happened. Lines that were changed or added by an ignored commit will be blamed on the previous commit that changed that line or nearby lines. This option may be specified multiple times to ignore more than one revision. If the blame.markIgnoredLines config option is set, then lines that were changed by an ignored commit and attributed to another commit will be marked with a ? in the blame output. If the blame.markUnblamableLines config option is set, then those lines touched by an ignored commit that we could not attribute to another revision are marked with a *.
--ignore-revs-file <file>Ignore revisions listed in file, which must be in the same format as an fsck.skipList. This option may be repeated, and these files will be processed after any files specified with the blame.ignoreRevsFile config option. An empty file name, "", will clear the list of revs from previously processed files.
-[no-]progressProgress status is reported on the standard error stream by default when it is attached to a terminal. This flag enables progress reporting even if not attached to a terminal. Can’t use --progress together with --porcelain or --incremental.
--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.
--contents <file>When <rev> is not specified, the command annotates the changes starting backwards from the working tree copy. This flag makes the command pretend as if the working tree copy has the contents of the named file (specify - to make the command read from the standard input).
--reverse <rev>..<rev>Walk history forward instead of backward. Instead of showing the revision in which a line appeared, this shows the last revision in which a line has existed. This requires a range of revision like START..END where the path to blame exists in START. git blame --reverse START is taken as git blame --reverse START..HEAD for convenience.
--これ以降の引数がファイル名であることを指定。
--show-statsInclude additional statistics at the end of blame output.
line-porcelainShow the porcelain format, but output commit information for each line, not just the first time a commit is referenced. Implies --porcelain.
--encoding=<encoding>Specifies the encoding used to output author names and commit summaries. Setting it to none makes blame output unconverted data. For more information see the discussion about encoding in the git-log manual page.
--date <format>Specifies the format used to output dates. If --date is not provided, the value of the blame.date config variable is used. If the blame.date config variable is also not set, the iso format is used. For supported values, see the discussion of the --date option at git-log.
--score-debugInclude 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.
-h | --helpコマンドのヘルプを表示

説明

ファイルの変更履歴を確認するコマンド。

  • コミットされた変更が、行単位で表示される。
  • バグ発見時の犯人捜しに便利。
  • ファイルの各行に、その行を最後に修正したリビジョンからの情報で注釈を付ける。オプションで指定したリビジョンから注釈を付け始める。
  • -Lオプションで、指定した行の範囲に制限することができる。
  • 削除または置き換えられた行については何も表示されない。

関連

参考リンク

その他メモ

 「--」について

  • gitのコマンドでは、「--」で区切ったあとの引数で、コマンドの対象を制限することができる。
    このテクニックは、git log、git show、git diffなど様々なコマンドで利用される。
  • 「--」は、 git 以外のコマンドでは慣習的に「それ以降の引数をオプションとして見なさない」ことを表す。
    たとえば、 rm -- -r とすると、 -r はオプションではなくただの引数(ここでは -r という名前のファイル)を意味する。
  • git コマンドでは、上記に加えてブランチ名とファイル名が紛らわしい場合にも使われる。
    たとえば git checkout master は master ブランチをチェックアウトするが、git checkout -- master は master という名前のファイルをチェックアウトする。