Git
Chapters ▾ 2nd Edition

2.3 Git Grundlagen - Anzeigen der Commit-Historie

Anzeigen der Commit-Historie

Nachdem du mehrere Commits erstellt hast, oder wenn du ein Repository mit einer bestehenden Commit-Historie geklont hast, wirst du 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ühre diesen Befehl aus:

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

Wenn du git log in diesem Projekt aufrufst, solltest du 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 du sehen kannst, 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 dir exakt das anzuzeigen, wonach du suchst. Hier zeigen wir dir 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. Du kannst 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. Du kannst auch mehrere Optionen zur Verdichtung der Ausgabe von git log verwenden. Wenn du beispielsweise einige gekürzte Statistiken für jeden Commit sehen möchtest, kannst du 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 du sehen kannst, 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. Dir 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 du dir viele Commits ansiehst. 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 du dein eigenes Log-Ausgabeformat festlegen kannst. Dieses Verfahren ist besonders nützlich, wenn du Ausgaben für das maschinelle Parsen generierst – da du das Format explizit angibst, weißt du, 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

Parent-Hashes

%p

gekürzte Parent-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)

Du fragst dich 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 du also einen Patch an ein Projekt sendest und eines der Core-Mitglieder den Patch einbindet, erhalten beide die Anerkennung – du 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 deinen 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 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 du dein eigenes Format angeben kannst).

--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 du nur eine Teilmenge von Commits anzeigen kannst. Du hast eine solche Option bereits gesehen – die Option -2, die nur die letzten beiden Commits anzeigt. Du kannst die Option -<n> verwenden, wobei n eine beliebige ganze Zahl ist, um die letzten n Commits anzuzeigen. In der Praxis wirst du das selten verwenden, da Git standardmäßig alle Ausgaben über einen Pager leitet, so dass du immer nur eine Seite der Log-Ausgabe siehst.

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. Du kannst ein bestimmtes Datum wie "2008-01-15" angeben, oder ein relatives Datum wie "vor 2 Jahren 1 Tag 3 Minuten".

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

Anmerkung

Du kannst 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 empfängt und nur die Commits anzeigt, die die Anzahl der Vorkommen dieser Zeichenkette geändert haben. Wenn du beispielsweise den letzten Commit suchen möchtest, der einen Verweis auf eine bestimmte Funktion hinzugefügt oder entfernt hat, kannst du 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 du ein Verzeichnis oder einen Dateinamen angibst, kannst du 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 du zum Beispiel sehen möchtest, 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, kannst du 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 deinem Repository verwendeten Workflow ist es möglich, dass ein beträchtlicher Prozentsatz der Commits in deiner Log-Historie nur Merge-Commits sind, die in der Regel nicht sehr informativ sind. Um zu vermeiden, dass die Anzeige von Merge-Commits deinen Log-Verlauf überflutet, füge einfach die Log-Option --no-merges hinzu.

scroll-to-top