Der Befehl git blame ist ein vielseitiges Hilfsmittel zur Problemlösung, das umfassende Nutzungsoptionen bietet. Die übergeordnete Funktion von git blame ist es, die Autoren-Metadaten für bestimmte committete Zeilen in einer Datei anzuzeigen. Damit werden bestimmte Punkte im Verlauf einer Datei untersucht und Kontextinformationen dazu empfangen, wer der letzte Autor war, der die Zeile bearbeitet hat. Dies wird genutzt, um den Verlauf von spezifischem Code zu untersuchen und Fragen dazu zu beantworten, wie und warum welcher Code zu einem Repository hinzugefügt wurde.

Git blame wird häufig mit einer GUI-Anzeige eingesetzt. Online Git Hosting-Websites wie Bitbucket bieten blame views (Blame-Ansichten) an, die UI-Wrapper für git blame darstellen. Diese Ansichten werden bei gemeinschaftlichen Diskussionen zu Pull-Anfragen und Commits verwendet. Darüber hinaus bieten die meisten IDEs eine Git-Integration und verfügen ebenfalls über dynamische Blame-Ansichten.

Wie es funktioniert

Um die Funktionsweise von git blame zu demonstrieren, benötigen wir ein Repository mit einem gewissen Verlauf. Wir nutzen das Open-Source-Projekt git-blame-example. Dieses Open-Source-Projekt ist ein einfaches Repository, das eine Datei README.md mit ein paar Commits verschiedener Autoren enthält. Der erste Schritt unseres Anwendungsbeispiels für git blame ist die Erstellung eines git clone des Beispiel-Repositorys.

git clone https://kevzettler@bitbucket.org/kevzettler/git-blame-example.git && cd git-blame-example

Nun haben wir eine Kopie des Beispielcodes und können uns diesen mit git blame etwas genauer betrachten. Der Status des Beispiel-Repositorys kann mithilfe von git log untersucht werden. Der Commit-Verlauf sollte ungefähr wie folgt aussehen:

$ git log
    commit 548dabed82e4e5f3734c219d5a742b1c259926b2
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:55:15 2018 +0000

        Another commit to help git blame track the who, the what, and the when

    commit eb06faedb1fdd159d62e4438fc8dbe9c9fe0728b
    Author: Juni Mukherjee <jmukherjee@atlassian.com>
    Date:   Thu Mar 1 19:53:23 2018 +0000

        Creating the third commit, along with Kev and Albert, so that Kev can get git blame docs.

    commit 990c2b6a84464fee153253dbf02e845a4db372bb
    Merge: 82496ea 89feb84
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 05:33:01 2018 +0000

        Merged in albert-so/git-blame-example/albert-so/readmemd-edited-online-with-bitbucket-1519865641474 (pull request #2)

        README.md edited online with Bitbucket

    commit 89feb84d885fe33d1182f2112885c2a64a4206ec
    Author: Albert So <aso@atlassian.com>
    Date:   Thu Mar 1 00:54:03 2018 +0000

        README.md edited online with Bitbucket

git blame funktioniert nur mit einzelnen Dateien. Um nützliche Ausgaben zu erhalten, ist die Angabe eines Dateipfads erforderlich. Die Standardausführung von git blame gibt einfach das Hilfsmenü für die Befehle aus. In diesem Beispiel sehen wir uns die Datei README.MD an. Es ist bei vielen Open-Source-Projekten üblich, eine README-Datei im Stammverzeichnis eines Git-Repository als Dokumentationsquelle für das Projekt aufzunehmen.

git blame README.MD

Durch Ausführen des obigen Befehls erhalten wir unser erstes Beispiel für eine blame-Ausgabe. Die folgende Ausgabe ist ein Teil der komplette blame-Ausgabe für die README-Datei. Zudem ist diese Ausgabe statisch und zeigt den Zustand des Repositorys zum Zeitpunkt der Erstellung dieses Dokuments an.

$ git blame README.md
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  1) # Git Blame example
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  2)
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  3) This repository is an example of a project with multiple contributors making commits.
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  4)
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  5) The repo use used elsewhere to demonstrate `git blame`
    82496ea3 (kevzettler     2018-02-28 13:37:02 -0800  6)
    89feb84d (Albert So      2018-03-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 laboris 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
    89feb84d (Albert So      2018-03-01 00:54:03 +0000  8)
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000  9) Annotates each line in the given file with information from the revision which last modified the line. Optionally, start annotating from the given revision.
    eb06faed (Juni Mukherjee 2018-03-01 19:53:23 +0000 10)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 11) Creating a line to support documentation needs for git blame.
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 12)
    548dabed (Juni Mukherjee 2018-03-01 19:55:15 +0000 13) Also, it is important to have a few of these commits to clearly reflect the who, the what and the when. This will help Kev get good screenshots when he runs the git blame on this README.

Dies ist ein Beispiel für die ersten 13 Zeilen der Datei README.md. Sehen wir uns einmal jede Zeile an, um die Ausgabe etwas besser zu verstehen. Die folgende Tabelle zeigt den Inhalt von Zeile 3 und die Spalten der Tabelle geben den Inhalt der jeweiligen Spalte an.

ID Autor Zeitstempel Zeilennummer Zeileninhalt
89feb84d Albert So 2018-03-01 00:54:03 +0000 3 Dieses Repository ist ein Beispiel für ein Projekt mit mehreren Mitwirkenden, die Commits durchführen.

Wenn wir uns die Blame-Ausgabeliste ansehen, können wir bereits einige Punkte erkennen. Es sind drei Autoren aufgeführt. Neben dem Verwalter des Projekts Kev Zettler sind auch Albert So und Juni Mukherjee aufgeführt. Autoren sind im Allgemeinen der hilfreichste Teil der Ausgabe von git blame. Die Spalte "Timestamp" (Zeitstempel) bietet einen zusätzlichen wichtigen Anhaltspunkt. Die Art der Änderung wird durch die Spalte "Line Content" (Zeileninhalt) angegeben.

Allgemeine Optionen

git blame -L 1,5 README.md

Durch die Option -L wird die Ausgabe auf den angeforderten Zeilenbereich beschränkt. Hier haben wir die Ausgabe auf die Zeilen 1 bis 5 begrenzt.

git blame -e README.md

Die Option -e zeigt die E-Mail-Adresse des Autors anstatt des Benutzernamens.

git blame -w README.md

Die Option -w ignoriert Leerzeichenänderungen. Wenn ein vorheriger Autor das Einrücken in einer Datei bearbeitet hat, indem er von Tabs zu Leerzeichen gewechselt oder auch neue Zeilen hinzugefügt hat, macht dies die Ausgabe von git blame leider schwerer erkennbar, da all diese Änderungen angezeigt werden.

git blame -M README.md

Die Option -M erkennt Zeilen, die innerhalb derselben Datei verschoben oder kopiert wurden. Damit wird der ursprüngliche Autor der Zeilen anstelle des letzten Autors ausgegeben, der die Zeilen verschoben oder kopiert hat.

git blame -C README.md

Die Option -C erkennt Zeilen, die aus anderen Zeilen verschoben oder kopiert wurden. Damit wird der ursprüngliche Autor der Zeilen anstelle des letzten Autors ausgegeben, der die Zeilen verschoben oder kopiert hat.

Git Blame vs Git Log

Während mit git blame der letzte Autor angezeigt wird, der eine Zeile bearbeitet hat, ist es häufig wichtiger, zu erfahren, wann eine Zeile ursprünglich hinzugefügt wurde. Es kann mühsam sein, dies mit git blame herauszufinden. Dazu ist eine Kombination der Optionen -w, -C und -M erforderlich. Es kann daher praktischer sein, den git log-Befehl zu verwenden.

Um alle ursprünglichen Commits aufzulisten, bei denen ein bestimmter Code hinzugefügt oder bearbeitet wurde, führe git log mit der Option -S aus. Ergänze die Option -S mit dem Code, nach dem du suchst. Sehen wir uns als Beispiel einmal eine der Zeilen aus der README-Ausgabe oben an. Nehmen wir den Text "CSS3D and WebGL renderers" aus Zeile 12 der README Ausgabe.

$ git log -S"CSS3D and WebGL renderers." --pretty=format:'%h %an %ad %s'
    e339d3c85 Mario Schuettel Tue Oct 13 16:51:06 2015 +0200 reverted README.md to original content
    509c2cc35 Daniel Tue Sep 8 13:56:14 2015 +0200 Updated README
    cb20237cc Mr.doob Mon Dec 31 00:22:36 2012 +0100 Removed DOMRenderer. Now with the CSS3DRenderer it has become irrelevant.

Diese Ausgabe zeigt uns, dass der Inhalt der README dreimal von drei verschiedenen Autoren hinzugefügt oder bearbeitet wurde. Er wurde ursprünglich in Commit cb20237cc von Mr.doob hinzugefügt. In diesem Beispiel wurde git log auch die Option --pretty-format vorangestellt. Mit dieser Option wird das standardmäßige Ausgabeformat von git log so umgewandelt, dass es dem Format von git log entspricht. Weiterführende Informationen zur Verwendung und zu Konfigurationsmöglichkeiten findest du auf der git log-Seite.

Zusammenfassung

Der Befehl git blame wird verwendet, um den Inhalt einer Datei Zeile für Zeile zu untersuchen und so zu sehen, welche Zeile zuletzt bearbeitet wurde und welcher Autor diese Änderungen vorgenommen hat. Das Ausgabeformat von git blame kann mit verschiedenen Befehlszeilenoptionen verändert werden. Git-Hosting-Lösungen wie Bitbucket bieten Blame-Ansichten, die häufig eine bessere Oberfläche für die Nutzung von git blame über die Befehlszeile bereitstellen. git blame und "git log" können kombiniert werden, um den Verlauf eines Dateiinhalts besser nachvollziehen zu können. Der Befehl git log hat eine ähnliche Blame-Funktion. Um mehr darüber zu erfahren, besuche die git log-Übersichtsseite.

Du möchtest mit Git arbeiten?

Sieh dir dieses interaktive Tutorial an.

Jetzt loslegen