Git-Tutorial: git log für Fortgeschrittene – Commit-Historie filtern (Teil 2)

Der Befehl git log dient unter anderem dazu, ein Projekt nach spezifischen Commits zu filtern und genau diejenigen aufzufinden, die uns interessieren. Im vorangehenden Teil dieses Tutorials haben wir einige Filtermöglichkeiten kennengelernt. Nun diskutieren wir weitere.

Nach Dateien

Oftmals sind wir nur an Änderungen an einer spezifischen Datei interessiert. Um eine dateibezogene Historie anzuzeigen, müssen wir nur den Dateipfad angeben. Um alle Commits anzuzeigen, die entweder foo.py oder bar.py tangieren, nutzen wir dieses Kommando:

git log -- foo.py bar.py

Der Parameter -- sagt Git, dass die nachfolgenden Argumente Dateipfade und keine Branch-Namen sind. Falls keine Gefahr besteht, diese zu vermengen, können wir -- auch weglassen.

Nach Inhalt

Es ist auch möglich, nach Commits zu suchen, die eine bestimmte Zeile Quellcode einführen oder entfernen. Diese Funktion wird Pickaxe genannt und hat die Form -S"<string>". Wenn wir wissen möchten, wann der String Hello, World! zu irgendwelchen Dateien unseres Projekts hinzugefügt wurde, fragen wir dies so ab:

git log -S"Hello, World!"

Um die Suche mithilfe eines regulären Ausdrucks statt mit einem String durchzuführen, können wir stattdessen die Option -G"<regex>" nutzen.

Das ist ein sehr mächtiges Debugging-Werkzeug, denn wir können alle Commits lokalisieren, die eine bestimmte Codezeile betreffen. Wir können uns sogar anzeigen lassen, wann eine Zeile kopiert oder in eine andere Datei bewegt wurde.

Nach Bereich

Desweiteren haben wir die Möglichkeit, nach einem Bereich von Commits zu suchen und nur diejenigen Commits anzuzeigen, die in diesem Bereich enthalten sind. Den Bereich spezifizieren wir mit <von> und <bis> als Commit-Referenzen:

git log <von>..<bis>

Dieser Befehl ist besonders wertvoll, wenn wir Branch-Referenzen als Parameter verwenden. So haben wir eine einfache Möglichkeit, um die Unterschiede zwischen zwei Branches abzurufen. Nehmen wir den folgenden Befehl:

git log master..feature

Der Bereich master..feature enthält alle Commits, die im feature-Branch, aber nicht im master-Branch enthalten sind. Anders gesagt: Hier sehen wir, wie weit der feature-Branch sich entwickelt hat, seit er vom master abgezweigt wurde.

Hinweis: Wenn wir die Reihenfolge umkehren (feature..master), sehen wir alle Commits, die im master-Branch, aber nicht im feature-Branch sind. Wenn git log Commits für beide Versionen ausgibt, wissen wir, dass unsere Historie divergiert ist.

Merge-Commits filtern

Per Voreinstellung inkludiert git log Merge-Commits in die Ausgabe. Manche Teams verfolgen jedoch eine Always-merge-Strategie: Sie mergen Upstream-Änderungen in Topic-Branches, statt den Topic-Branch auf den Upstream-Branch zu rebasen. Das resultiert in einer großen Menge an Merge-Commits in der Projekthistorie.

Wenn wir nicht wollen, dass git log diese Merge-Commits anzeigt, können wir die Option --no-merges nutzen:

git log --no-merges

Interessieren wir uns andererseits nur für die Merge-Commits, verwenden wir die Option --merges:

git log --merges

So erhalten wir alle Commits, die mindestens zwei Eltern haben.

Zusammenfassung

Mit diesem Wissen aus dieser Tutorial-Reihe (siehe auch Teil 1, 2 und 3) sollten wir in der Lage sein, die erweiterten git log-Parameter effektiv für uns zu nutzen, um die Ausgabe zu formatieren und anzuzeigende Commits zu selektieren. Dies befähigt uns, exakt die Infos aus einer Projekthistorie zu ziehen, die wir benötigen.

Es handelt sich um einen wichtigen Bestandteil des Git-Werkzeugkastens, aber vergessen wir nicht, dass git log oft in Verbindung mit anderen Git-Befehlen genutzt wird. Wenn wir den gewünschten Commit gefunden haben, werden wir ihn in aller Regel mit git checkout, git revert oder einem anderen Werkzeug weiter manipulieren. Es lohnt sich gewiss, sich auch in die effektive Nutzung dieser Kommandos tiefer einzulesen. Hier ist eine Übersicht unserer Inhalte und Anleitungen zu Git.

Git und Bitbucket Server effektiv nutzen? Wir sind Ihr Partner!

Kennen Sie Bitbucket Server (vormals Stash), Atlassians Git-Repository-Managementsystem? Bitbucket Server bietet eine zentrale Lösung zum Management des gesamten distributierten Codes: Hier kommen alle Git-Repositories im Unternehmen zusammen, hier finden Entwickler immer die letzte offizielle Version eines Projekts, hier können Projektverantwortliche Berechtigungen kontrollieren, um sicherzustellen, dass die richtigen Nutzer Zugriff auf den richtigen Code haben. Möchten Sie mehr erfahren? Wir sind offizieller Vertriebspartner von Atlassian und einer der größten Atlassian Experts Partner weltweit. Gerne unterstützen wir Sie bei der Evaluierung, Lizenzierung und Adaption von Bitbucket Server.

Übrigens: //SEIBERT/MEDIA bietet auch professionelle Grundlagen- und Aufbau-Workshops zu Git und Bitbucket Server an.

Weiterführende Infos

99 Argumente für Bitbucket Server (Stash) als Git-Repository-Manager
Branch-basierte Git-Workflows adaptieren
Echte Integration: Das Zusammenspiel von JIRA, Stash und Bamboo
Interview: Die Vorteile von Git in der Software-Entwicklung und die Möglichkeiten von Bitbucket Server (Stash)
So funktioniert die Lizenzierung von Atlassian-Produkten