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.
git log --pretty=format
Spezifikator | Beschreibung der Ausgabe |
---|---|
|
Commit-Hash |
|
gekürzter Commit-Hash |
|
Hash-Baum |
|
gekürzter Hash-Baum |
|
Parent-Hashes |
|
gekürzte Parent-Hashes |
|
Name des Autors |
|
E-Mail-Adresse des Autors |
|
Erstellungs-Datum des Autors (Format berücksichtigt --date=option) |
|
relatives Erstellungs-Datum des Autors |
|
Name des Committers |
|
E-Mail-Adresse des Committers |
|
Erstellungs-Datum des Committers |
|
relatives Erstellungs-Datum des Committers |
|
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.
git log
Option | Beschreibung |
---|---|
|
Zeigt den Patch (bzw. Änderung) an, der mit den jeweiligen Commits eingefügt wurde. |
|
Anzeige der Statistiken für Dateien, die in den einzelnen Commits geändert wurden. |
|
Anzeige der geänderten/eingefügten/gelöschten Zeilen des Befehls --stat. |
|
Listet nach den Commit-Informationen die geänderten Dateien auf |
|
Listet die Dateien mit hinzugefügten/geänderten/gelöschten Informationen auf. |
|
Zeigt nur die ersten paar Zeichen der SHA-1-Prüfsumme an, nicht aber alle 40. |
|
Zeigt das Datum in einem relativen Format an (z.B. „vor 2 Wochen“), anstatt das volle Datumsformat zu verwenden. |
|
Zeigt neben der Historie ein ASCII-Diagramm des Branch- und Zusammenführungsverlaufs an. |
|
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). |
|
Kurzform für die gleichzeitige Verwendung von |
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.
Note
|
Du kannst mehr als eine Instanz der Suchkriterien |
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.
git log
Option | Beschreibung |
---|---|
|
Zeigt nur die letzten n Commits an |
|
Begrenzt die angezeigten Commits auf die, die nach dem angegebenen Datum gemacht wurden. |
|
Begrenzt die angezeigten Commits auf die, die vor dem angegebenen Datum gemacht wurden. |
|
Zeigt nur Commits an, bei denen der Autoren-Eintrag mit der angegebenen Zeichenkette übereinstimmt. |
|
Zeigt nur Commits an, bei denen der Committer-Eintrag mit der angegebenen Zeichenkette übereinstimmt. |
|
Zeigt nur Commits an, deren Commit-Beschreibung die Zeichenkette enthält |
|
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.
Tip
|
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 |