Einrichtung und Konfiguration
Projekte holen und erstellen
Grundlegende Snapshots
Branching und Merging
Projekte teilen und aktualisieren
Inspektion und Vergleich
Patching
Debugging
Externe Systeme
Server-Administration
Anleitungen
- gitattributes
- Konventionen der Kommandozeile
- Tägliches Git
- Häufig gestellte Fragen (FAQ)
- Glossar
- Hooks
- gitignore
- gitmodules
- Revisionen
- Submodule
- Tutorial
- Workflows
- Alle Anleitungen...
Administration
Plumbing-Befehle
-
2.52.0
2025-11-17
- 2.51.1 → 2.51.2 keine Änderungen
-
2.51.0
2025-08-18
- 2.50.1 keine Änderungen
-
2.50.0
2025-06-16
- 2.44.1 → 2.49.1 keine Änderungen
-
2.44.0
2024-02-23
- 2.43.1 → 2.43.7 keine Änderungen
-
2.43.0
2023-11-20
- 2.41.1 → 2.42.4 keine Änderungen
-
2.41.0
2023-06-01
- 2.38.1 → 2.40.4 keine Änderungen
-
2.38.0
2022-10-02
- 2.34.1 → 2.37.7 keine Änderungen
-
2.34.0
2021-11-15
- 2.31.1 → 2.33.8 keine Änderungen
- 2.31.0 keine Änderungen
- 2.30.1 → 2.30.9 keine Änderungen
-
2.30.0
2020-12-27
- 2.29.1 → 2.29.3 keine Änderungen
-
2.29.0
2020-10-19
- 2.23.1 → 2.28.1 keine Änderungen
-
2.23.0
2019-08-16
- 2.16.6 → 2.22.5 keine Änderungen
- 2.15.4 keine Änderungen
- 2.13.7 → 2.14.6 keine Änderungen
-
2.12.5
2017-09-22
-
2.11.4
2017-09-22
- 2.9.5 → 2.10.5 keine Änderungen
-
2.8.6
2017-07-30
-
2.7.6
2017-07-30
- 2.6.7 keine Änderungen
-
2.5.6
2017-05-05
-
2.4.12
2017-05-05
-
2.3.10
2015-09-28
- 2.1.4 → 2.2.3 keine Änderungen
-
2.0.5
2014-12-17
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.blankBoundarygesteuert werden. - --root
-
Behandle keine Root-Commits als Grenzen. Dies kann auch über die Konfigurationsoption
blame.showRootgesteuert 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 wiegitdiffHunk-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.
gitblame--reverseSTARTwird der Bequemlichkeit halber alsgitblame--reverseSTART..HEADinterpretiert. - --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
nonebewirkt, 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.
--progresskann nicht zusammen mit--porcelainoder--incrementalverwendet 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
-Mwerden 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
-COption angegeben wird, hat das <num>-Argument der letzten-COption 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.markIgnoredLinesgesetzt 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 Konfigurationsoptionblame.markUnblamableLinesgesetzt 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
fileaufgelistet sind und das gleiche Format wie einefsck.skipListhaben müssen. Diese Option kann wiederholt werden, und diese Dateien werden nach allen mit der Konfigurationsoptionblame.ignoreRevsFileangegebenen 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.repeatedLinesangepasst werden. - --color-by-age
-
Färbe Zeilenbeschriftungen im Standardformat je nach Alter der Zeile. Die Konfigurationsoption
color.blame.highlightRecentsteuert, 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.showEmailgesteuert 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,
-soder-eist 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.
-
Jenter Blame-Eintrag beginnt immer mit einer Zeile von
<40-byte-hex-sha1> <sourceline> <resultline> <num-lines>
Zeilennummern werden ab 1 gezählt.
-
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.).
-
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.
HinweisFü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
--dateim 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-fileverarbeitet. - 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].
GIT
Teil der git[1] Suite