Git
Chapters ▾ 2nd Edition

2.3 Git Grundlagen - Anzeigen der Commit-Historie

Anzeigen der Commit-Historie

Nachdem Sie mehrere Commits erstellt haben, oder wenn Sie ein Repository mit einer bestehenden Commit-Historie geklont haben, werden Sie wahrscheinlich zurückschauen wollen, um zu erfahren, was geschehen ist. Das wichtigste und mächtigste Werkzeug dafür ist der Befehl git log.

Diese Beispiele verwenden ein sehr einfaches Projekt namens „simplegit“. Um das Projekt zu erstellen, führen Sie diesen Befehl aus:

$ git clone https://github.com/schacon/simplegit-progit

Wenn Sie git log in diesem Projekt aufrufen, sollten Sie eine Ausgabe erhalten, die ungefähr so aussieht:

$ git log
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    Remove unnecessary test

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    Initial commit

Standardmäßig, d.h. ohne Argumente, listet git log die in diesem Repository vorgenommenen Commits in umgekehrter chronologischer Reihenfolge auf, d.h. die neuesten Commits werden als Erstes angezeigt. Wie Sie sehen können, listet dieser Befehl jeden Commit mit seiner SHA-1-Prüfsumme, dem Namen und der E-Mail-Adresse des Autors, dem Erstellungs-Datum und der Commit-Beschreibung auf.

Eine Vielzahl von Optionen stehen für den Befehl git log zur Verfügung, um Ihnen exakt das anzuzeigen, wonach Sie suchen. Hier zeigen wir Ihnen einige der gängigsten.

Eine der hilfreichsten Optionen ist -p oder --patch. Sie zeigt die Änderungen (die patch-Ausgabe) an, die bei jedem Commit durchgeführt wurden. Sie können auch die Anzahl der anzuzeigenden Protokolleinträge begrenzen, z.B. mit -2 werden nur die letzten beiden Einträge dargestellt.

$ git log -p -2
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

diff --git a/Rakefile b/Rakefile
index a874b73..8f94139 100644
--- a/Rakefile
+++ b/Rakefile
@@ -5,7 +5,7 @@ require 'rake/gempackagetask'
 spec = Gem::Specification.new do |s|
     s.platform  =   Gem::Platform::RUBY
     s.name      =   "simplegit"
-    s.version   =   "0.1.0"
+    s.version   =   "0.1.1"
     s.author    =   "Scott Chacon"
     s.email     =   "schacon@gee-mail.com"
     s.summary   =   "A simple gem for using Git in Ruby code."

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    Remove unnecessary test

diff --git a/lib/simplegit.rb b/lib/simplegit.rb
index a0a60ae..47c6340 100644
--- a/lib/simplegit.rb
+++ b/lib/simplegit.rb
@@ -18,8 +18,3 @@ class SimpleGit
     end

 end
-
-if $0 == __FILE__
-  git = SimpleGit.new
-  puts git.show
-end

Diese Option zeigt die gleichen Informationen an, jedoch mit der diff Ausgabe direkt nach jedem Eintrag. Dies ist sehr hilfreich für die Codeüberprüfung oder um schnell zu durchsuchen, was während einer Reihe von Commits passiert ist, die ein Teammitglied hinzugefügt hat. Sie können auch mehrere Optionen zur Verdichtung der Ausgabe von git log verwenden. Wenn Sie beispielsweise einige gekürzte Statistiken für jeden Commit sehen möchten, können Sie die Option --stat verwenden:

$ git log --stat
commit ca82a6dff817ec66f44342007202690a93763949
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Mon Mar 17 21:52:11 2008 -0700

    Change version number

 Rakefile | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

commit 085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 16:40:33 2008 -0700

    Remove unnecessary test

 lib/simplegit.rb | 5 -----
 1 file changed, 5 deletions(-)

commit a11bef06a3f659402fe7563abf99ad00de2209e6
Author: Scott Chacon <schacon@gee-mail.com>
Date:   Sat Mar 15 10:31:28 2008 -0700

    Initial commit

 README           |  6 ++++++
 Rakefile         | 23 +++++++++++++++++++++++
 lib/simplegit.rb | 25 +++++++++++++++++++++++++
 3 files changed, 54 insertions(+)

Wie Sie sehen können, gibt die Option --stat unter jedem Commit-Eintrag eine Liste der geänderten Dateien aus. Wie viele Dateien geändert wurden und wie viele Zeilen in diesen Dateien hinzugefügt und entfernt wurden. Sie enthält auch eine Zusammenfassung am Ende des Berichts.

Eine weitere wirklich nützliche Option ist --pretty. Diese Option ändert das Format der Log-Ausgabe in ein anderes als das Standard-Format. Ihnen stehen einige vorgefertigte Optionswerte zur Verfügung. Der Wert oneline für diese Option gibt jeden Commit in einer einzigen Zeile aus, was besonders nützlich ist, wenn Sie sich viele Commits ansehen. Darüber hinaus zeigen die Werte short, full und fuller die Ausgabe im etwa gleichen Format, allerdings mit mehr oder weniger Informationen an:

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 Change version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 Remove unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 Initial commit

Der interessanteste Wert ist format, mit dem Sie Ihr eigenes Log-Ausgabeformat festlegen können. Dieses Verfahren ist besonders nützlich, wenn Sie Ausgaben für das maschinelle Parsen generieren – da Sie das Format explizit angeben, wissen Sie, dass es sich mit Updates von Git nicht ändert:

$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 6 years ago : Change version number
085bb3b - Scott Chacon, 6 years ago : Remove unnecessary test
a11bef0 - Scott Chacon, 6 years ago : Initial commit

Wichtige Spezifikatoren für git log --pretty=format listet einige der nützlichsten Spezifikatoren auf, die format bietet.

Tabelle 1. Wichtige Spezifikatoren für git log --pretty=format
Spezifikator Beschreibung der Ausgabe

%H

Commit-Hash

%h

gekürzter Commit-Hash

%T

Hash-Baum

%t

gekürzter Hash-Baum

%P

Eltern-Hashes

%p

gekürzte Eltern-Hashes

%an

Name des Autors

%ae

E-Mail-Adresse des Autors

%ad

Erstellungs-Datum des Autors (Format berücksichtigt --date=option)

%ar

relatives Erstellungs-Datum des Autors

%cn

Name des Committers

%ce

E-Mail-Adresse des Committers

%cd

Erstellungs-Datum des Committers

%cr

relatives Erstellungs-Datum des Committers

%s

Thema (engl. Subject)

Sie fragen sich vielleicht, worin der Unterschied zwischen Autor und Committer besteht. Der Autor ist die Person, die das Werk ursprünglich geschrieben hat, während der Committer die Person ist, die das Werk zuletzt bearbeitet hat. Wenn Sie also einen Patch an ein Projekt senden und eines der Core-Mitglieder den Patch einbindet, erhalten Sie beide die Anerkennung – Sie als Autor und das Core-Mitglied als Committer. Wir werden diese Unterscheidung näher in Kapitel 5, Verteiltes Git erläutern.

Die Optionswerte oneline und format sind vor allem bei einer anderen log Option mit der Bezeichnung --graph hilfreich. Diese Option fügt ein schönes kleines ASCII-Diagramm hinzu, das Ihren Branch und den Merge-Verlauf zeigt:

$ git log --pretty=format:"%h %s" --graph
* 2d3acf9 Ignore errors from SIGCHLD on trap
*  5e3ee11 Merge branch 'master' of https://github.com/dustin/grit
|\
| * 420eac9 Add method for getting the current branch
* | 30e367c Timeout code and tests
* | 5a09431 Add timeout protection to grit
* | e1193f8 Support for heads with slashes in them
|/
* d6016bc Require time for xmlschema
*  11d191e Merge branch 'defunkt' into local

Dieser Ausgabetyp wird immer interessanter, wenn wir im nächsten Kapitel über das Branching und Merging sprechen.

Das sind nur einige einfache Optionen zur Ausgabe-Formatierung von git log – es gibt noch viele mehr. Allgemeine Optionen für git log listet die bisher von uns behandelten Optionen auf, sowie einige andere gängige Format-Optionen, die sinnvoll sein können, um die Ausgabe des log-Befehls zu ändern.

Tabelle 2. Allgemeine Optionen für git log
Option Beschreibung

-p

Zeigt den Patch (bzw. Änderung) an, der mit den jeweiligen Commits eingefügt wurde.

--stat

Anzeige der Statistiken für Dateien, die in den einzelnen Commits geändert wurden.

--shortstat

Anzeige der geänderten/eingefügten/gelöschten Zeilen des Befehls --stat.

--name-only

Listet nach den Commit-Informationen die geänderten Dateien auf

--name-status

Listet die Dateien mit hinzugefügten/geänderten/gelöschten Informationen auf.

--abbrev-commit

Zeigt nur die ersten paar Zeichen der SHA-1-Prüfsumme an, nicht aber alle 40.

--relative-date

Zeigt das Datum in einem relativen Format an (z.B. „vor 2 Wochen“), anstatt das volle Datumsformat zu verwenden.

--graph

Zeigt Sie neben der Historie ein ASCII-Diagramm des Branch- und Zusammenführungsverlaufs an.

--pretty

Zeigt Commits in einem anderen Format an. Zu den Optionswerten gehören oneline, short, full, fuller und format (womit Sie Ihr eigenes Format angeben können).

--oneline

Kurzform für die gleichzeitige Verwendung von --pretty=oneline und --abbrev-commit.

Einschränken der Log-Ausgabe

Zusätzlich zu den Optionen für die Ausgabe-Formatierung bietet git log eine Reihe nützlicher einschränkender Optionen, d.h. Optionen, mit denen Sie nur eine Teilmenge von Commits anzeigen können. Sie haben eine solche Option bereits gesehen – die Option -2, die nur die letzten beiden Commits anzeigt. Sie können die Option -<n> verwenden, wobei n eine beliebige ganze Zahl ist, um die letzten n Commits anzuzeigen. In der Praxis werden Sie das selten verwenden, da Git standardmäßig alle Ausgaben über einen Pager leitet, so dass Sie jeweils nur eine Seite der Log-Ausgabe sehen.

Im Gegensatz dazu sind zeitbeschränkenden Optionen wie --since und --until sehr nützlich. Dieser Befehl ruft z.B. die Liste der in den letzten beiden Wochen durchgeführten Commits ab:

$ git log --since=2.weeks

Dieser Befehl funktioniert mit vielen Formaten. Sie können ein bestimmtes Datum wie "2008-01-15" angeben, oder ein relatives Datum wie "vor 2 Jahren 1 Tag 3 Minuten".

Sie können die Liste auch nach Commits filtern, die bestimmten Suchkriterien entsprechen. Mit der Option --author können Sie nach einem bestimmten Autor filtern und mit der Option --grep können Sie nach Schlüsselwörtern in den Übertragungsmeldungen suchen.

Anmerkung

Sie können mehr als eine Instanz der Suchkriterien --author und --grep angeben, was die Commit-Ausgabe auf Commits beschränkt, die jedem der --author Muster und jedem der --grep Muster entsprechen; durch Hinzufügen der Option --all-match wird die Ausgabe jedoch weiter auf diejenigen Commits beschränkt, die allen --grep Mustern entsprechen.

Ein weiterer wirklich hilfreicher Filter ist die Option -S (umgangssprachlich als Git’s „Pickel“-Option bezeichnet), die eine Zeichenkette übernimmt und nur die Commits anzeigt, die die Anzahl der Vorkommen dieses Strings geändert haben. Wenn Sie beispielsweise den letzten Commit suchen möchten, der einen Verweis auf eine bestimmte Funktion hinzugefügt oder entfernt hat, können Sie Folgendes aufrufen:

$ git log -S function_name

Die letzte hier angesprochene nützliche Option, die als Filter an git log`übergeben werden kann, ist ein Pfad. Wenn Sie ein Verzeichnis oder einen Dateinamen angeben, können Sie die Log-Ausgabe auf Commits beschränken, die eine Änderung an diesen Dateien vorgenommen haben. Das ist immer die letzte Option und wird in der Regel durch Doppelstriche (--`) eingeleitet, um Pfade von den Optionen zu trennen.

$ git log -- path/to/file

In Optionen zum Anpassen der Ausgabe von git log sind diese und einige andere gängige Optionen als Referenz aufgelistet.

Tabelle 3. Optionen zum Anpassen der Ausgabe von git log
Option Beschreibung

-<n>

Zeigt nur die letzten n Commits an

--since, --after

Begrenzt die angezeigten Commits auf die, die nach dem angegebenen Datum gemacht wurden.

--until, --before

Begrenzt die angezeigten Commits auf die, die vor dem angegebenen Datum gemacht wurden.

--author

Zeigt nur Commits an, bei denen der Autoren-Eintrag mit der angegebenen Zeichenkette übereinstimmt.

--committer

Zeigt nur Commits an, bei denen der Committer-Eintrag mit der angegebenen Zeichenkette übereinstimmt.

--grep

Zeigt nur Commits an, deren Commit-Beschreibung die Zeichenkette enthält

-S

Zeigt nur Commits an, die solchen Code hinzufügen oder entfernen, der mit der Zeichenkette übereinstimmt

Wenn Sie zum Beispiel sehen möchten, welche der Commits die Testdateien in der Git-Quellcode-Historie ändern, die von Junio Hamano im Monat Oktober 2008 committet wurden und keine Merge-Commits sind, können Sie in etwa folgendes aufrufen:

$ git log --pretty="%h - %s" --author='Junio C Hamano' --since="2008-10-01" \
   --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attributes are in use
acd3b9e - Enhance hold_lock_file_for_{update,append}() API
f563754 - demonstrate breakage of detached checkout with symbolic link HEAD
d1a43f2 - reset --hard/read-tree --reset -u: remove unmerged new paths
51a94af - Fix "checkout --track -b newbranch" on detached HEAD
b0ad11e - pull: allow "git pull origin $something:$current_branch" into an unborn branch

Von den fast 40.000 Commits in der Git-Quellcode-Historie zeigt dieser Befehl die 6 Commits an, die diesen Kriterien entsprechen.

Hinweis
Die Anzeige von Merge-Commits unterdrücken

Abhängig von dem in Ihrem Repository verwendeten Workflow ist es möglich, dass ein beträchtlicher Prozentsatz der Commits in Ihrer Log-Historie nur Merge-Commits sind, die in der Regel nicht sehr informativ sind. Um zu vermeiden, dass die Anzeige von Merge-Commits Ihren Log-Verlauf überflutet, fügen Sie einfach die Log-Option --no-merges hinzu.

scroll-to-top