W3docs

git blame

Informationen zum Befehl git blame, wie er funktioniert, Beispiele und eine Übersicht der wichtigsten Optionen.

Beschreibung

Der Befehl git blame versieht jede Zeile einer Datei mit Informationen über den letzten Commit, der sie geändert hat — den Commit-Hash, den Autor und den Zeitstempel. Mit anderen Worten beantwortet er für jede Zeile die Frage: „Wer hat das geschrieben, und wann?".

Es handelt sich um einen schreibgeschützten Inspektionsbefehl. Er ändert weder den Verlauf noch Dateien; er zeigt lediglich Metadaten an, die bereits im Repository gespeichert sind. Entwickler greifen auf git blame zurück, um:

  • den Autor einer verwirrenden oder fehlerhaften Zeile zu finden, um nach der Absicht dahinter zu fragen.
  • den Commit zu lokalisieren, der eine Änderung eingeführt hat, und dann seine vollständige Nachricht mit git show zu lesen.
  • zu verstehen, wie sich eine Datei entwickelt hat, wenn der Commit-Verlauf allein zu grob ist, um auf eine einzelne Zeile zu zeigen.

git blame

Info

git blame zeigt nur den zuletzt geänderten Commit pro Zeile. Wenn eine Zeile mehrfach bearbeitet wurde, sind frühere Autoren verborgen. Um eine Zeile weiter in der Geschichte zurückzuverfolgen, führen Sie blame erneut auf einer älteren Revision aus (siehe Eine Zeile durch die Geschichte verfolgen unten).

Funktionsweise

Um deutlich zu zeigen, wie git blame funktioniert, betrachten wir ein Beispiel mit einer README.md-Datei und einigen Commits von verschiedenen Autoren.

Im folgenden Beispiel verwenden wir git blame. Den Zustand des Beispiel-Repositorys kann man mit git log erkunden. Der Commit-Verlauf sieht folgendermaßen aus:

git log und git blame

git log
commit 745a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a
Author: Bob Smith <[email protected]m>
Date: Fri Apr 1 19:55:15 2019 +0000
Another commit to help git blame track the who, the what, and the when
commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
Author: Bob Smith <[email protected]m>
Date: Fri Apr 1 19:53:23 2019 +0000
Creating the third commit, along with Nick and Robert, so that Nick can get git blame docs.
commit 990c2b6a84464fee153253dbf02e845a4db372bb
Merge: 82496ea 89feb84
Author: Tom Brown <[email protected]m>
Date: Fri Apr 1 05:33:01 2019 +0000
Merged in tom-brown/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)
README.md edited online with Bitbucket
commit 73a0b1c2d3e4f5a6b7c8d9e0f1a2b3c4d5e6f7a8
Author: Tom Brown <[email protected]m>
Date: Fri Apr 1 00:54:03 +0000
README.md edited online with Bitbucket

Der Befehl git blame arbeitet auf einzelnen Dateien. Die standardmäßige Ausführung von git blame gibt die Blame-Informationen für die angegebene Datei aus.

Die folgende Ausgabe ist ein Ausschnitt der vollständigen Blame-Ausgabe der README-Datei:

git blame

git blame README.md
83253a1b (marioswift 2019-02-28 13:37:02 -0800 1) # Git Blame example
83253a1b (marioswift 2019-02-28 13:37:02 -0800 2)
73a0b1c2 (Tom Brown 2019-04-01 00:54:03 +0000 3) Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.
83253a1b (marioswift 2019-02-28 13:37:02 -0800 4)
83253a1b (marioswift 2019-02-28 13:37:02 -0800 5) There are many variations of passages of Lorem Ipsum available, but the majority have suffered alteration in some form, by injected humour, or randomised words which don't look even slightly believable.
83253a1b (marioswift 2019-02-28 13:37:02 -0800 6)
73a0b1c2 (Tom Brown 2019-04-01 00:54:03 +0000 7) Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod TEMPOR incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laborum nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum

Die Ausgabe lesen

Jede Blame-Zeile besteht aus vier Teilen:

83253a1b (marioswift 2019-02-28 13:37:02 -0800 1) # Git Blame example
└──┬───┘  └───┬────┘ └────────┬─────────────┘  └──────────┬──────────┘
             └─ the line's content
   │          │               │               └─ line number in the file
   │          │               └─ commit timestamp
   │          └─ author of that commit
   └─ abbreviated commit hash

Zeilen mit demselben Commit-Hash wurden zuletzt gemeinsam geändert. Um zu prüfen, was dieser Commit tatsächlich getan hat, kopieren Sie den Hash und führen Sie git show 83253a1b aus.

Häufige Optionen

git blame akzeptiert mehrere Optionen, die die Ausgabe einschränken oder die Zuweisung der Urheberschaft ändern. Die nützlichsten sind nachfolgend zusammengefasst.

BefehlBedeutung
git blame -L 1,3 README.mdBegrenzt die Ausgabe auf den angegebenen Zeilenbereich — hier Zeilen 1 bis 3. Sie können auch -L 5,+10 verwenden, um bei Zeile 5 zu beginnen und 10 Zeilen anzuzeigen.
git blame -e README.mdZeigt die E-Mail-Adresse jedes Autors anstelle seines Benutzernamens.
git blame -w README.mdIgnoriert reine Leerzeichen-Änderungen. Wenn ein früherer Autor nur eine Zeile neu eingerückt hat (z. B. Tabs zu Leerzeichen), würde git blame ihm sonst die Urheberschaft zuschreiben; -w ignoriert dies und betrachtet nur die eigentliche Inhaltsänderung.
git blame -M README.mdErkennt Zeilen, die innerhalb derselben Datei verschoben oder kopiert wurden, und gibt den ursprünglichen Autor anstelle desjenigen an, der sie verschoben hat.
git blame -C README.mdErkennt Zeilen, die aus anderen Dateien verschoben oder kopiert wurden, und gibt den ursprünglichen Autor an. Übergeben Sie -C zwei- oder dreimal für eine aggressivere Suche.
git blame -L :functionName README.mdBegrenzt blame auf eine einzelne Funktion anhand ihres Namens (verwendet Git's funcname-Regex) anstelle eines numerischen Zeilenbereichs.

Eine Zeile durch die Geschichte verfolgen

Da blame bei dem neuesten Commit pro Zeile aufhört, müssen Sie manchmal einen Schritt tiefer gehen. Sobald Sie den Commit-Hash aus der Blame-Ausgabe haben, können Sie blame erneut auf dem Commit vor diesem ausführen, um zu sehen, wie die Zeile aussah — und wer sie geschrieben hat — zu einem früheren Zeitpunkt.

# Blame the file as it was just before commit 73a0b1c2 touched it
git blame 73a0b1c2^ -- README.md

Das ^ (Caret) bedeutet „der Eltern-Commit dieses Commits". Durch Wiederholung können Sie eine Zeile rückwärts durch ihre gesamte Geschichte verfolgen, eine Revision nach der anderen.

Sie können blame auch auf einen Revisionsbereich beschränken, sodass Sie nur die Urheberschaft aus einem bestimmten Abschnitt der Geschichte sehen:

# Blame README.md considering only commits between v1.0 and v2.0
git blame v1.0..v2.0 -- README.md

Git Blame vs. Git Log

Der Befehl git blame zeigt den letzten Autor, der eine Zeile geändert hat, aber manchmal müssen Sie sehen, wann eine Zeile ursprünglich hinzugefügt wurde. Das ist mit git blame allein umständlich — selbst mit einer Kombination aus den Optionen -w, -C und -M. Um nachzuverfolgen, wann ein bestimmter Text zuerst erschienen (oder entfernt) wurde, ist git log das bessere Werkzeug.

Verwenden Sie git log mit der Option -S (der „Spitzhacke"), um Commits anzuzeigen, bei denen ein bestimmter String hinzugefügt oder entfernt wurde.

Beispiel: Wann wurde ein String geändert?

git log -S Beispiel

git log -S "CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
e339d3c85a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d John Carter Fri Jun 13 16:51:06 2015 +0200 reverted README.md to original content
509c2cc35a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d Max Fri Jul 8 13:56:14 2015 +0200 Updated README
cb20237cc1a2b3c4d5e6f7a8b9c0d1e2f3a4b5c6 Leo Sat Aug 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

Die Ausgabe zeigt, dass die README.md-Datei dreimal von drei Autoren hinzugefügt und geändert wurde. Die Option --pretty=format:'...' passt die git log-Ausgabe an, um bestimmte Felder wie Commit-Hash, Autor, Datum und Betreff anzuzeigen.

Verwandte Befehle

git blame ist am nützlichsten in Kombination mit anderen Inspektionsbefehlen:

  • git log — den vollständigen Commit-Verlauf durchsuchen und mit -S/-G durchsuchen.
  • git show — die vollständige Nachricht und den Diff eines Commits anzeigen, den Sie über blame gefunden haben.
  • git diff — den aktuellen Zustand einer Zeile mit einer früheren Revision vergleichen.

Übung

Übung
Was sind die Funktionen und Optionen des Befehls 'git blame' in Git?
Was sind die Funktionen und Optionen des Befehls 'git blame' in Git?
Was this page helpful?