0%

Den Verlauf lesen

Zwei Momentaufnahmen vergleichen

git show vergleicht einen Commit mit dem unmittelbar vorherigen Commit. Das passt genau, wenn du eine einzelne Änderung prüfst. Es reicht nicht, wenn deine Frage mit „Was war zwischen diesen beiden Zeitpunkten anders?“ beginnt.

Git show vergleicht einen Commit mit seinem Vorgänger. Git diff vergleicht dagegen beliebige ältere und neuere Momentaufnahmen in einer gewählten Richtung; Pluszeilen kommen hinzu, Minuszeilen werden entfernt.

Die beiden Zustände benennen

git diff vergleicht Zustände. Wenn du zwei Commit-Kennungen angibst, ist die erste die Ausgangsmomentaufnahme und die zweite das Ziel:

git diff <start> <destination>

In dieser Form gibt es keine Optionen. Die beiden Kennungen sind einfach die Commits, die du vergleichen möchtest, in der Richtung, in der du die Antwort lesen willst. Die Abbildung zeigt die übliche Richtung von älter zu neuer. Git akzeptiert aber auch die umgekehrte Reihenfolge und beschreibt dann den Weg zurück.

Nahe am oberen Ende des Verlaufs von Fern & Fig korrigiert ein Commit den Preis des Feigenbaums, und der nächste dokumentiert, wo die Bestandsdaten liegen. Vergleiche diese beiden Momentaufnahmen:

git diff 8e9e8ec ed9fce3

Zwischen ihnen hat sich nur README.md geändert. Die ersten drei Zeilen sind Kontext. Die neuere Momentaufnahme fügt eine Überschrift Stock und einen Satz hinzu, der stock.csv als maßgebliche Datenquelle benennt.

Die Richtung verändert die Geschichte

Die Reihenfolge zählt. Wenn der ältere Commit zuerst kommt, bedeutet +: „in der neueren Momentaufnahme vorhanden, in der älteren aber nicht“. Vertauschst du die Kennungen, beschreibt Git den Weg in umgekehrter Richtung. Dieselben Zeilen erscheinen dann als Entfernungen.

Git ändert dabei nicht seine Meinung. Ein Unterschied hat immer eine Richtung. Stell ihn dir als Satz vor:

Was muss sich ausgehend von 8e9e8ec ändern, um bei ed9fce3 anzukommen?

In dieser Richtung wird die Dokumentation hinzugefügt.

show und diff beantworten unterschiedliche Fragen

Die Ausgaben sehen ähnlich aus, weil beide Vergleiche sind:

  • git show <commit> fragt, was ein Commit gegenüber seinem Vorgänger geändert hat.

  • git diff <older> <newer> fragt, wie sich zwei beliebige Momentaufnahmen unterscheiden.

Die beiden Commits für git diff müssen nicht direkt aufeinanderfolgen. Git besitzt beide Momentaufnahmen bereits und kann sie unmittelbar vergleichen, ohne jeden Commit dazwischen erneut durchzugehen.

Die Form ohne Commit-Angaben

git diff vergleicht immer zwei Zustände. Zwei Commits zu benennen, ist nur die ausdrücklichste Art, sie auszuwählen.

Ohne Commit-Angaben vergleicht Git verfolgte Dateien in deinem Arbeitsbaum mit der Staging-Area. Bevor du eine Änderung bereitstellst, stimmt die dortige Version noch mit deinem letzten Commit überein. Der bloße Befehl zeigt deshalb noch nicht bereitgestellte Änderungen, auch wenn du sie bereits im Editor gespeichert hast. Neue, nicht verfolgte Dateien zeigt er nicht. Diese findest du mit git status.

git diff

In diesem Kapitel liest du das Repository einer anderen Person. Deshalb hat der Befehl hier nichts zu melden. Sobald du Dateien änderst, wirst du ihn ständig ausführen. Das nächste Kapitel beginnt damit. Eine leere Ausgabe ist ein echtes Ergebnis: Es gibt keinen Unterschied.

Du führst git diff OLD NEW aus. Was sagt dir eine Zeile, die in der Ausgabe mit + beginnt?

Du kannst jetzt den Verlauf lesen, einen Commit öffnen und zwei Zustände vergleichen. Die letzte Lektion verbindet diese drei Schritte, um eine wichtige Frage zu beantworten.