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 vereinfachtes 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

    changed the version number

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

    removed unnecessary test

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

    first commit

Standardmäßig listet git log, ohne Argumente, 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 und Vielfalt von Optionen für den Befehl git log stehen zur Verfügung, um Ihnen exakt das anzuzeigen, wonach Sie gesucht haben. Hier zeigen wir Ihnen einige der gängigsten.

Eine der hilfreichsten Optionen ist -p oder --patch. Sie zeigt den Unterschied (die patch-Ausgabe) an, der bei jedem Commit eingefügt wird. Sie können auch die Anzahl der anzuzeigenden Protokolleinträge begrenzen, z.B. mit -2 nur die letzten beiden Einträge darstellen.

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

    changed the 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

    removed 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 dem Unterschied dass sie direkt hinter jedem Eintrag stehen. Diese Funktion ist sehr hilfreich für die Code-Überprüfung oder zum schnellen Durchsuchen der Vorgänge während einer Reihe von Commits, die ein Teammitglied hinzugefügt hat. Sie können auch eine Reihe von Optionen zur Verdichtung mit git log verwenden. Wenn Sie beispielsweise einige gekürzte Statistiken für jede Übertragung 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

    changed the 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

    removed 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

    first 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 Optionen zur Verfügung. Die Option oneline druckt jeden Commit in einer einzigen Zeile, was besonders nützlich ist, wenn Sie sich viele Commits ansehen. Darüber hinaus zeigen die Optionen short, full, und fuller die Ausgabe im etwa gleichen Format, allerdings mit weniger bzw. mehr Informationen:

$ git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number
085bb3bcb608e1e8451d4b2432f8ecbe6306e7e7 removed unnecessary test
a11bef06a3f659402fe7563abf99ad00de2209e6 first commit

Die interessanteste Option ist format, mit der 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 : changed the version number
085bb3b - Scott Chacon, 6 years ago : removed unnecessary test
a11bef0 - Scott Chacon, 6 years ago : first commit

Nützliche Optionen für git log --pretty=format listet einige der nützlichsten Optionen auf, die format bietet.

Table 1. Nützliche Optionen für git log --pretty=format
Option 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

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 erläutern in Kapitel 5, Verteiltes Git.

Die Optionen oneline und format sind vor allem bei einer anderen log-Option mit 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 git://github.com/dustin/grit
|\
| * 420eac9 Added a 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.

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

-p

Zeigt den Patch 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 nur der geänderten/eingefügten/gelöschten Zeile des Befehls --stat.

--name-only

Listet die Dateien auf, die nach den Commit-Informationen geändert wurden.

--name-status

Listet die Dateien auf, die von hinzugefügten, geänderten oder gelöschten Informationen betroffen sind.

--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 ein ASCII-Diagramm der Branch an und verbindet die Historie mit der Log-Ausgabe.

--pretty

Zeigt Commits in einem anderen Format an. Zu den Optionen 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. In Wahrheit können Sie -<n> verwenden, wobei n eine beliebige ganze Zahl ist, um die letzten n Commits anzuzeigen. In der Praxis werden Sie das kaum verwenden, da Git standardmäßig alle Ausgaben über einen Pager leitet, so dass Sie jeweils nur eine Seite der Log-Ausgabe sehen.

Die zeitbeschränkenden Optionen wie --since und --until sind 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 Autoren filtern, und mit der Option --grep können Sie nach Schlüsselwörtern in den Übertragungsmeldungen suchen.

Note

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 das letzte Commit suchen möchten, das einen Verweis auf eine bestimmte Funktion hinzugefügt oder entfernt hat, können Sie Folgendes aufrufen:

$ git log -S function_name

Zuletzt eine wirklich nützliche Option, die Sie als Filter an git log übergeben können, der 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.

In Optionen zur Anpassen der Ausgabe von git log werden wir Ihnen diese und einige andere gängige Optionen als Referenz auflisten.

Table 3. Optionen zur 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 committed wurden und keine Merge-Commits sind, können Sie etwa so 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.

Tip
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.