English ▾ Themen ▾ Neueste Version ▾ git-blame zuletzt aktualisiert in 2.52.0

NAME

git-blame - Zeigt an, welche Revision und welcher Autor jede Zeile einer Datei zuletzt geändert hat

SYNOPSIS

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>]
	    [--color-lines] [--color-by-age] [--progress] [--abbrev=<n>]
	    [ --contents <file> ] [<rev> | --reverse <rev>..<rev>] [--] <file>

BESCHREIBUNG

Beschriftet jede Zeile in der angegebenen Datei mit Informationen aus der Revision, die die Zeile zuletzt geändert hat. Optional kann die Beschriftung von der angegebenen Revision aus gestartet werden.

Wenn -L einmal oder mehrmals angegeben wird, beschränkt es die Beschriftung auf die angeforderten Zeilen.

Der Ursprung von Zeilen wird automatisch über Umbenennungen der gesamten Datei verfolgt (derzeit gibt es keine Option, die Verfolgung von Umbenennungen zu deaktivieren). Um Zeilen zu verfolgen, die von einer Datei in eine andere verschoben wurden, oder um Zeilen zu verfolgen, die aus einer anderen Datei kopiert und eingefügt wurden, usw., siehe die Optionen -C und -M.

Der Bericht gibt Ihnen keine Auskunft über Zeilen, die gelöscht oder ersetzt wurden. Sie müssen ein Werkzeug wie git diff oder die im folgenden Absatz kurz erwähnte "Pickaxe"-Schnittstelle verwenden.

Neben der Unterstützung für die Dateibeschriftung unterstützt Git auch die Suche im Entwicklungsverlauf, wann ein Code-Snippet in einer Änderung vorkam. Dies ermöglicht es, zu verfolgen, wann ein Code-Snippet zu einer Datei hinzugefügt, zwischen Dateien verschoben oder kopiert und schließlich gelöscht oder ersetzt wurde. Dies geschieht durch die Suche nach einer Textzeichenkette im Diff. Ein kleines Beispiel für die Pickaxe-Schnittstelle, die nach blame_usage sucht

$ git log --pretty=oneline -S'blame_usage'
5040f17eba15504bad66b14a645bddd9b015ebb7 blame -S <ancestry-file>
ea4c7f9bf69e781dd0cd88d2bccb2bf5cc15c9a7 git-blame: Make the output

OPTIONEN

-b

Zeige leere SHA-1 für Grenz-Commits an. Dies kann auch über die Konfigurationsoption blame.blankBoundary gesteuert werden.

--root

Behandle keine Root-Commits als Grenzen. Dies kann auch über die Konfigurationsoption blame.showRoot gesteuert werden.

--show-stats

Zusätzliche Statistiken am Ende der Blame-Ausgabe einfügen.

-L <start>,<end>
-L :<funcname>

Beschrifte nur den durch <start>,<end> oder den Funktionsnamen-Regex <funcname> angegebenen Zeilenbereich. Kann mehrmals angegeben werden. Überlappende Bereiche sind erlaubt.

<start> und <end> sind optional. -L <start> oder -L <start>, reicht von <start> bis zum Dateiende. -L ,<end> reicht vom Anfang der Datei bis <end>.

<Start> und <Ende> können eine der folgenden Formen annehmen:

  • <Nummer>

    Wenn <Start> oder <Ende> eine Zahl ist, gibt sie eine absolute Zeilennummer an (Zeilen werden ab 1 gezählt).

  • /<Regulärer Ausdruck>/

    Diese Form verwendet die erste Zeile, die dem gegebenen POSIX-<Regulärer Ausdruck> entspricht. Wenn <Start> ein regulärer Ausdruck ist, wird vom Ende des vorherigen -L-Bereichs, falls vorhanden, ansonsten vom Anfang der Datei gesucht. Wenn <Start> ^/<Regulärer Ausdruck>/ ist, wird vom Anfang der Datei gesucht. Wenn <Ende> ein regulärer Ausdruck ist, wird ab der von <Start> angegebenen Zeile gesucht.

  • +<Offset> oder -<Offset>

    Dies ist nur für <Ende> gültig und gibt eine Anzahl von Zeilen vor oder nach der von <Start> angegebenen Zeile an.

Wenn :<Funktionsname> anstelle von <Start> und <Ende> angegeben ist, ist dies ein regulärer Ausdruck, der den Bereich vom ersten Funktionsnamen-Zeile, der <Funktionsname> entspricht, bis zur nächsten Funktionsnamen-Zeile bezeichnet. :<Funktionsname> sucht vom Ende des vorherigen -L-Bereichs, falls vorhanden, ansonsten vom Anfang der Datei. ^:<Funktionsname> sucht vom Anfang der Datei. Die Funktionsnamen werden auf die gleiche Weise bestimmt wie git diff Hunk-Header ermittelt (siehe Defining a custom hunk-header in gitattributes[5]).

-l

Lange Revision anzeigen (Standard: aus).

-t

Rohes Zeitstempel anzeigen (Standard: aus).

-S <revs-file>

Verwende Revisionen aus revs-file anstelle des Aufrufs von git-rev-list[1].

--reverse <rev>..<rev>

Verfolge den Verlauf vorwärts statt rückwärts. Anstatt die Revision anzuzeigen, in der eine Zeile erschienen ist, zeigt dies die letzte Revision, in der eine Zeile existiert hat. Dies erfordert einen Revisionsbereich wie START..END, wobei der Pfad zum Blame in START existiert. git blame --reverse START wird der Bequemlichkeit halber als git blame --reverse START..HEAD interpretiert.

--first-parent

Folge nur dem ersten Eltern-Commit, wenn ein Merge-Commit gesehen wird. Diese Option kann verwendet werden, um zu bestimmen, wann eine Zeile in einen bestimmten Integrationszweig eingeführt wurde, anstatt wann sie insgesamt in den Verlauf eingeführt wurde.

-p
--porcelain

Ausgabe in einem für maschinelle Verarbeitung konzipierten Format.

--line-porcelain

Gib das Porcelain-Format aus, aber zeige Commit-Informationen für jede Zeile an, nicht nur beim ersten Mal, wenn ein Commit referenziert wird. Impliziert --porcelain.

--incremental

Gib das Ergebnis inkrementell in einem für maschinelle Verarbeitung konzipierten Format aus.

--encoding=<encoding>

Gibt die für die Ausgabe von Autorennamen und Commit-Zusammenfassungen verwendete Kodierung an. Die Einstellung auf none bewirkt, dass die Blame-Ausgabe unkonvertierte Daten liefert. Weitere Informationen finden Sie in der Diskussion über Kodierung im Handbuch von git-log[1].

--contents <file>

Beschrifte unter Verwendung des Inhalts aus der angegebenen Datei, beginnend mit <rev>, falls angegeben, ansonsten HEAD. Sie können - angeben, um die Befehlseingabe der Dateiinhalte von der Standardeingabe lesen zu lassen.

--date <format>

Gibt das Format für die Datumsangabe an. Wenn --date nicht angegeben ist, wird der Wert der Konfigurationsvariable blame.date verwendet. Wenn die Konfigurationsvariable blame.date ebenfalls nicht gesetzt ist, wird das ISO-Format verwendet. Unterstützte Werte finden Sie in der Diskussion der Option --date im Handbuch von git-log[1].

--progress
--no-progress

Der Fortschrittsstatus wird standardmäßig auf dem Standard-Fehlerstrom berichtet, wenn dieser an ein Terminal angeschlossen ist. Diese Flagge aktiviert die Fortschrittsberichterstattung auch dann, wenn sie nicht an ein Terminal angeschlossen ist. --progress kann nicht zusammen mit --porcelain oder --incremental verwendet werden.

-M[<num>]

Verschobene oder kopierte Zeilen innerhalb einer Datei erkennen. Wenn ein Commit einen Block von Zeilen verschiebt oder kopiert (z.B. die ursprüngliche Datei hat A und dann B, und der Commit ändert sie zu B und dann A), bemerkt der traditionelle blame-Algorithmus nur die Hälfte der Bewegung und beschriftet typischerweise die nach oben verschobenen Zeilen (d.h. B) mit dem Elternteil und weist die nach unten verschobenen Zeilen (d.h. A) dem Kind-Commit zu. Mit dieser Option werden beide Gruppen von Zeilen auf den Elternteil beschriftet, indem zusätzliche Inspektionsdurchläufe durchgeführt werden.

<num> ist optional, aber es ist die untere Grenze für die Anzahl alphanumerischer Zeichen, die Git als innerhalb einer Datei verschoben/kopiert erkennen muss, damit diese Zeilen dem Eltern-Commit zugeordnet werden. Der Standardwert ist 20.

-C[<num>]

Zusätzlich zu -M werden Zeilen erkannt, die aus anderen Dateien verschoben oder kopiert wurden, die im selben Commit geändert wurden. Dies ist nützlich, wenn Sie Ihr Programm neu organisieren und Code über Dateien hinweg verschieben. Wenn diese Option zweimal angegeben wird, sucht der Befehl zusätzlich nach Kopien aus anderen Dateien im Commit, der die Datei erstellt. Wenn diese Option dreimal angegeben wird, sucht der Befehl zusätzlich nach Kopien aus anderen Dateien in beliebigen Commits.

<num> ist optional, aber es ist die untere Grenze für die Anzahl alphanumerischer Zeichen, die Git als zwischen Dateien verschoben/kopiert erkennen muss, damit diese Zeilen dem Eltern-Commit zugeordnet werden. Der Standardwert ist 40. Wenn mehr als eine -C Option angegeben wird, hat das <num>-Argument der letzten -C Option Wirkung.

--ignore-rev <rev>

Ignoriere Änderungen, die durch die Revision vorgenommen wurden, wenn Blame zugewiesen wird, als ob die Änderung nie stattgefunden hätte. Zeilen, die durch einen ignorierten Commit geändert oder hinzugefügt wurden, werden dem vorherigen Commit zugewiesen, der diese Zeile oder nahegelegene Zeilen geändert hat. Diese Option kann mehrmals angegeben werden, um mehr als eine Revision zu ignorieren. Wenn die Konfigurationsoption blame.markIgnoredLines gesetzt ist, werden Zeilen, die durch einen ignorierten Commit geändert und einem anderen Commit zugeordnet wurden, in der Blame-Ausgabe mit einem ? markiert. Wenn die Konfigurationsoption blame.markUnblamableLines gesetzt ist, werden Zeilen, die von einem ignorierten Commit berührt wurden und keinem anderen Commit zugeordnet werden konnten, mit einem * markiert. In den Porcelain-Modi werden ignored und unblamable jeweils auf einer neuen Zeile ausgegeben.

--ignore-revs-file <file>

Ignoriere Revisionen, die in file aufgelistet sind und das gleiche Format wie eine fsck.skipList haben müssen. Diese Option kann wiederholt werden, und diese Dateien werden nach allen mit der Konfigurationsoption blame.ignoreRevsFile angegebenen Dateien verarbeitet. Ein leerer Dateiname, "", löscht die Liste der Revisionen aus zuvor verarbeiteten Dateien.

--color-lines

Färbe Zeilenbeschriftungen im Standardformat unterschiedlich, wenn sie vom selben Commit wie die vorhergehende Zeile stammen. Dies erleichtert die Unterscheidung von Codeblöcken, die von verschiedenen Commits eingeführt wurden. Die Farbe ist standardmäßig cyan und kann über die Konfigurationsoption color.blame.repeatedLines angepasst werden.

--color-by-age

Färbe Zeilenbeschriftungen im Standardformat je nach Alter der Zeile. Die Konfigurationsoption color.blame.highlightRecent steuert, welche Farbe für jeden Altersbereich verwendet wird.

-h

Hilfenachricht anzeigen.

-c

Verwende den gleichen Ausgabemodus wie git-annotate[1] (Standard: aus).

--score-debug

Füge Debugging-Informationen hinzu, die sich auf die Bewegung von Zeilen zwischen Dateien (siehe -C) und von Zeilen innerhalb einer Datei (siehe -M) beziehen. Die erste angezeigte Zahl ist der Score. Dies ist die Anzahl der alphanumerischen Zeichen, die als zwischen oder innerhalb von Dateien verschoben erkannt wurden. Dies muss einen bestimmten Schwellenwert überschreiten, damit git blame diese Codezeilen als verschoben betrachtet.

-f
--show-name

Zeige den Dateinamen im ursprünglichen Commit an. Standardmäßig wird der Dateiname angezeigt, wenn eine Zeile aus einer Datei mit einem anderen Namen stammt, aufgrund der Erkennung von Umbenennungen.

-n
--show-number

Zeige die Zeilennummer im ursprünglichen Commit an (Standard: aus).

-s

Unterdrücke den Autorennamen und Zeitstempel aus der Ausgabe.

-e
--show-email

Zeige die E-Mail-Adresse des Autors anstelle des Namens des Autors (Standard: aus). Dies kann auch über die Konfigurationsoption blame.showEmail gesteuert werden.

-w

Ignoriere Leerzeichen beim Vergleich der Version des Elternteils mit der des Kindes, um herauszufinden, woher die Zeilen stammen.

--abbrev=<n>

Anstatt die standardmäßigen 7+1 Hexadezimalziffern als abgekürzten Objektbezeichner zu verwenden, verwende <m>+1 Ziffern, wobei <m> mindestens <n> ist, aber sicherstellt, dass die Commit-Objektbezeichner eindeutig sind. Beachten Sie, dass 1 Spalte für ein Caret verwendet wird, um den Grenz-Commit zu markieren.

DAS STANDARDFORMAT

Wenn weder die Option --porcelain noch --incremental angegeben ist, gibt git blame eine Beschriftung für jede Zeile aus mit

  • abgekürzter Objektbezeichner für den Commit, von dem die Zeile stammt;

  • Identität des Autors (standardmäßig der Autorenname und das Datum, es sei denn, -s oder -e ist angegeben); und

  • Zeilennummer

vor dem Zeileninhalt.

DAS PORCELAIN-FORMAT

In diesem Format wird jede Zeile nach einem Header ausgegeben; der Header enthält mindestens die erste Zeile, die

  • 40-stellige SHA-1 des Commits, dem die Zeile zugeordnet ist;

  • die Zeilennummer der Zeile in der Originaldatei;

  • die Zeilennummer der Zeile in der finalen Datei;

  • auf einer Zeile, die eine Gruppe von Zeilen aus einem anderen Commit als der vorhergehenden startet, die Anzahl der Zeilen in dieser Gruppe. Auf nachfolgenden Zeilen fehlt dieses Feld.

Diese Header-Zeile wird gefolgt von den folgenden Informationen mindestens einmal für jeden Commit

  • der Autorenname ("author"), E-Mail ("author-mail"), Zeit ("author-time") und Zeitzone ("author-tz"); entsprechend für den Committer.

  • der Dateiname im Commit, dem die Zeile zugeordnet ist.

  • die erste Zeile der Commit-Log-Nachricht ("summary").

Der Inhalt der eigentlichen Zeile wird nach dem obigen Header ausgegeben, vorangestellt mit einem TAB. Dies dient dazu, später weitere Header-Elemente hinzufügen zu können.

Das Porcelain-Format unterdrückt im Allgemeinen Commit-Informationen, die bereits gesehen wurden. Zum Beispiel werden zwei Zeilen, die demselben Commit zugeordnet sind, beide angezeigt, aber die Details für diesen Commit werden nur einmal angezeigt. Informationen, die spezifisch für einzelne Zeilen sind, werden nicht zusammengefasst, wie z. B. Revisionen, die als ignored oder unblamable markiert sind. Dies ist effizienter, erfordert aber möglicherweise, dass der Leser mehr Zustand behält. Die Option --line-porcelain kann verwendet werden, um vollständige Commit-Informationen für jede Zeile auszugeben, was eine einfachere (aber weniger effiziente) Verwendung wie folgt ermöglicht:

# count the number of lines attributed to each author
git blame --line-porcelain file |
sed -n 's/^author //p' |
sort | uniq -c | sort -rn

BEREICHE ANGEBEN

Im Gegensatz zu git blame und git annotate in älteren Versionen von git kann der Umfang der Beschriftung sowohl auf Zeilenbereiche als auch auf Revisionsbereiche beschränkt werden. Die Option -L, die die Beschriftung auf einen Zeilenbereich beschränkt, kann mehrmals angegeben werden.

Wenn Sie den Ursprung für die Zeilen 40-60 der Datei foo finden möchten, können Sie die Option -L wie folgt verwenden (sie bedeuten dasselbe - beide fragen nach 21 Zeilen ab Zeile 40)

git blame -L 40,60 foo
git blame -L 40,+21 foo

Sie können auch einen regulären Ausdruck verwenden, um den Zeilenbereich anzugeben

git blame -L '/^sub hello {/,/^}$/' foo

wodurch die Beschriftung auf den Körper der hello-Routine beschränkt wird.

Wenn Sie sich nicht für Änderungen, die älter als Version v2.6.18 sind, oder für Änderungen, die älter als 3 Wochen sind, interessieren, können Sie Revisionsbereichsspezifizierer verwenden, die ähnlich wie bei git rev-list funktionieren.

git blame v2.6.18.. -- foo
git blame --since=3.weeks -- foo

Wenn Revisionsbereichsspezifizierer verwendet werden, um die Beschriftung zu begrenzen, werden Zeilen, die sich seit der Bereichsgrenze (entweder der Commit v2.6.18 oder der aktuellste Commit, der mehr als 3 Wochen alt ist im obigen Beispiel) nicht geändert haben, für diesen Commit der Bereichsgrenze beschriftet.

Eine besonders nützliche Methode ist es, festzustellen, ob eine hinzugefügte Datei Zeilen enthält, die durch Copy-and-Paste aus vorhandenen Dateien erstellt wurden. Manchmal deutet dies darauf hin, dass der Entwickler schlampig war und den Code nicht richtig refaktorisiert hat. Sie können zuerst den Commit finden, der die Datei mit

git log --diff-filter=A --pretty=short -- foo

und dann die Änderung zwischen dem Commit und seinen Eltern mit der commit^!-Notation beschriften.

git blame -C -C -f $commit^! -- foo

INKREMENTELLE AUSGABE

Wenn der Befehl mit der Option --incremental aufgerufen wird, gibt er das Ergebnis aus, während es aufgebaut wird. Die Ausgabe wird im Allgemeinen zuerst über Zeilen sprechen, die von neueren Commits betroffen sind (d. h. die Zeilen werden in unregelmäßiger Reihenfolge beschriftet) und ist für interaktive Betrachter gedacht.

Das Ausgabeformat ist dem Porcelain-Format ähnlich, enthält jedoch nicht die tatsächlichen Zeilen aus der Datei, die beschriftet wird.

  1. Jenter Blame-Eintrag beginnt immer mit einer Zeile von

    <40-byte-hex-sha1> <sourceline> <resultline> <num-lines>

    Zeilennummern werden ab 1 gezählt.

  2. Wenn ein Commit zum ersten Mal im Stream erscheint, werden verschiedene andere Informationen darüber ausgegeben, wobei jede Zeile mit einem einwortigen Tag am Anfang beginnt, der die zusätzlichen Commit-Informationen beschreibt (Autor, E-Mail, Committer, Daten, Zusammenfassung usw.).

  3. Im Gegensatz zum Porcelain-Format werden die Dateiname-Informationen immer angegeben und beenden den Eintrag

    "filename" <whitespace-quoted-filename-goes-here>

    und somit ist es für einen zeilen- und wortorientierten Parser (was für die meisten Skriptsprachen natürlich sein sollte) recht einfach zu parsen.

    Hinweis
    Für Leute, die parsen: Um es robuster zu machen, ignorieren Sie einfach alle Zeilen zwischen der ersten und der letzten ("<sha1>" und "filename") , bei denen Sie die Tag-Wörter (oder sich für diesen bestimmten interessieren) am Anfang der "erweiterten Informations"-Zeilen nicht erkennen. Auf diese Weise wird ein Blame-Viewer nicht beeinträchtigt, wenn jemals zusätzliche Informationen (wie die Commit-Kodierung oder erweiterte Commit-Kommentare) hinzugefügt werden.

AUTOREN ABILDEN

Siehe gitmailmap[5].

KONFIGURATION

Alles unterhalb dieser Zeile in diesem Abschnitt wird selektiv aus der git-config[1]-Dokumentation übernommen. Der Inhalt ist derselbe wie dort zu finden.

blame.blankBoundary

Zeige leere Commit-Objektnamen für Grenz-Commits in git-blame[1]. Diese Option ist standardmäßig false.

blame.coloring

Dies bestimmt das Farbschema, das auf die Blame-Ausgabe angewendet wird. Es kann repeatedLines, highlightRecent oder none sein, wobei letzteres der Standard ist.

blame.date

Gibt das Format an, das für die Ausgabe von Daten in git-blame[1] verwendet wird. Wenn nicht gesetzt, wird das ISO-Format verwendet. Unterstützte Werte finden Sie in der Diskussion der Option --date im Handbuch von git-log[1].

blame.showEmail

Zeige die E-Mail-Adresse des Autors anstelle des Namens des Autors in git-blame[1]. Diese Option ist standardmäßig false.

blame.showRoot

Behandle keine Root-Commits als Grenzen in git-blame[1]. Diese Option ist standardmäßig false.

blame.ignoreRevsFile

Ignoriere Revisionen, die in der Datei aufgelistet sind, eine unverkürzte Objektbezeichnung pro Zeile, in git-blame[1]. Leerzeichen und Kommentare, die mit # beginnen, werden ignoriert. Diese Option kann mehrmals wiederholt werden. Leere Dateinamen setzen die Liste der ignorierten Revisionen zurück. Diese Option wird vor der Befehlszeilenoption --ignore-revs-file verarbeitet.

blame.markUnblamableLines

Markiere Zeilen, die durch eine ignorierte Revision geändert wurden, die wir keinem anderen Commit zuordnen konnten, mit einem * in der Ausgabe von git-blame[1].

blame.markIgnoredLines

Markiere Zeilen, die durch eine ignorierte Revision geändert wurden, die wir einem anderen Commit zugeordnet haben, mit einem ? in der Ausgabe von git-blame[1].

SIEHE AUCH

GIT

Teil der git[1] Suite