Freigeben über


Grundlegendes zur Vereinfachung des Git-Verlaufs

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Die Vereinfachung des Git-Verlaufs kann ein verwirrendes Tier sein. 99% der Zeit, die Sie nicht einmal kennen, es ist vorhanden, aber gelegentlich springt es aus den dunklen Ecken von Git und biss Sie. In diesem Artikel werden wir untersuchen, was die Vereinfachung der Geschichte ist und wie sie Verwirrung verursachen kann, wenn Sie den Dateiverlauf betrachten.

Beginnen wir mit einem gängigen Szenario:

  1. Sie übertragen eine Änderung an eine Datei, und führen Sie dann die Änderung in den Hauptvorgang zusammen.
  2. Einige Ihrer Kollegen führen auch ihre Zweigstellen mit dem Hauptteil zusammen.
  3. Sie kommen einige Zeit später zurück und stellen fest, dass Ihre Änderungen fehlen.
  4. Suchen Sie nach dem Schuldigen, sehen Sie sich den Dateiverlauf an und beachten Sie... Ihre Änderungen werden nicht einmal aufgelistet!?

Die Git-Commit-Historie ist ein Baum. Manchmal ist der chronologische Verlauf nicht mit dem tatsächlichen Dateistrukturverlauf identisch. Diese Situation tritt am häufigsten auf, wenn ein Zusammenführungs-Commit eine Datei wieder in den ursprünglichen Zustand zurückgesetzt. In diesem Fall werden in der Standardverlaufsansicht nicht alle Änderungen angezeigt, da sich die Datei technisch nicht geändert hat. In diesem Szenario erkennt Git, dass er den Verlauf vereinfachen kann, und die "Änderungen", nach denen Sie am wahrscheinlichsten suchen, werden aus dem Protokoll entfernt.

Es sei denn, Sie haben es vorher geschafft, vielleicht frustriert zu werden, fragen Sie sich , wo das Häklich meine Änderungen gemacht hat?

Vereinfachung des Verlaufs: Standardmäßig aktiviert

Standardmäßig vereinfacht das Ausführen des Protokollbefehls in einer Datei git log file.txt den Verlauf automatisch, möglicherweise ausblenden einige Commits aus der Ausgabe. Weitere Informationen finden Sie auf der Git-Protokoll-Man-Seite.

Was zu Verwirrung beiträgt, ist, dass die Vereinfachung der Geschichte nicht auftritt, wenn Sie gerade ausgeführt git logwerden, weil Sie sich alle Änderungen ansehen, die nicht vereinfacht werden müssen.

Um die Vereinfachung des Verlaufs zu deaktivieren, müssen Sie die Befehlszeilenoption --full-historyverwenden.

Beispiel für eine Vereinfachung der Geschichte

Um besser zu verstehen, wie vereinfachung funktioniert, erstellen wir unser eigenes Beispiel für die Vereinfachung der Geschichte. Sehen wir uns zunächst ein Diagramm des Verlaufs an, das wir erstellen werden:

Git Branches

Wie Sie sehen können, gehen wir folgendermaßen vor:

  1. Erstellen Sie eine Datei.
  2. Fügen Sie dieser Datei eine Zeile in einer Verzweigung (Tiere) hinzu.
  3. Fügen Sie eine andere Zeile zu dieser Datei in einer anderen Verzweigung (Obst) hinzu.
  4. Verzweigungstiere wieder in den Hauptteil zusammenführen.
  5. Verzweigen Sie Obst zurück in den Hauptteil, und wählen Sie die gesamte Kopie der Datei aus dem Obstzweig aus.
  6. Überprüfen Sie den Verlauf der Datei.

Git wird die Geschichte für uns vereinfachen. Schritt 5 ist hier der Schlüssel. Wir ignorierten alle Veränderungen aus dem Tierzweig . Git wird feststellen, dass sich unsere Datei im Wesentlichen nicht zwischen Schritt 1 und Schritt 5 geändert hat , und daher werden nur zwei Verlaufseinträge angezeigt.

Zuerst erstellen wir die Datei und fügen sie zu unserem Repository hinzu:

> cd sample
> git init
> echo "some content" > test.txt
> git add test.txt
> git commit -m "Initial commit"

Jetzt entscheiden wir uns, den Text "Donkeys" an die Datei in einem Tierzweig anzufügen:

> git checkout -b animals
> echo "donkeys" >> test.txt
> git commit -am "We have added an animal"

Während wir experimentieren, entscheiden wir vielleicht, dass wir stattdessen obst in unserer Datei gehen möchten, also erstellen wir einen anderen Zweig und fügen stattdessen den Text "Bananen" am Ende der Datei an:

> git checkout main -b fruit
> echo "bananas" >> test.txt
> git commit -am "We have added a fruit"

Fühlen Sie sich zufrieden mit unseren Veränderungen, wir entscheiden uns, unsere Tierzweige wieder in den Hauptteil zusammenzuführen:

> git checkout main
> git merge animals

Sehen wir uns nun das Protokoll für unsere test.txt Datei an:

> git log test.txt
    
    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

So weit so gut, richtig? Nichts sieht aus der gewöhnlichen Protokollausgabe aus. Jetzt sagen wir, wir haben unsere Meinung geändert und beschlossen, unsere Fruchtzweige zusammenzuführen:

>git merge fruit
    
    Auto-merging test.txt
    CONFLICT (content): Merge conflict in test.txt
    Automatic merge failed; fix conflicts and then commit the result.

Uh-oh, ein Zusammenführungskonflikt. Nach einiger Überlegung entscheiden wir uns, die gesamte test.txt Datei aus unserem Obstzweig zu verwenden. In der Regel würden Sie eine Art Text-Editor- oder Seriendrucktool verwenden, aber wir erstellen einfach die gesamte Datei neu, da es nur zwei Zeilen ist:

> echo "some content" > test.txt
> echo "bananas" >> test.txt
> git commit -am "Fixed merge conflict"

Sehen wir uns nun den Verlauf unserer test.txt Datei an:

> git log test.txt
    
    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Sicher genug, wir sehen keine Änderungen von unserem ersten Experiment im Protokoll, noch sehen wir unsere Zusammenführung! Sind sie noch da? Haben Git die Änderungen vollständig beseitigt?

> git log --full-history test.txt

Wie Sie sehen können, obwohl es das Protokoll ohne die full-history Kennzeichnung vereinfacht hat, hat Git alle unsere Änderungen beibehalten:

> commit 5d0bb77a24e265dc154654fb3b5be331b53bf977
    Merge: 6b33d99 fdd4dfd
        Date:   Mon Feb 15 10:59:34 2016 -0500

        Fixed merge conflict

    commit fdd4dfd816c4efebc5bdb240f49e934e299db581
        Date:   Mon Feb 15 10:51:06 2016 -0500

        We have added a fruit

    commit 6b33d99b996c430a60c9552b79245d1aa8320339
        Date:   Mon Feb 15 10:45:33 2016 -0500

        We have added an animal

    commit 206613ccd9a54b055b184c7b6c16f2ece8067e51
        Date:   Mon Feb 15 10:44:18 2016 -0500

        Initial commit

Zusammenfassung der Vereinfachung des Git-Verlaufs

Das Ding an der Vereinfachung der Geschichte ist, dass Sie es in den meisten Zeiten nie bemerken werden. Aber wenn ein Zusammenführungskonflikt schief geht und Sie wissen möchten, was passiert ist, können Sie sich den Git-Protokollverlauf ansehen und sich fragen, wo Ihre Änderungen aufgetreten sind.

Jetzt wissen Sie, anstatt panikartig zu sein, dass:

  • Die Vereinfachung des Verlaufs für Dateien ist standardmäßig aktiviert.
  • Mit der --full-history Kennzeichnung erhalten Sie einen umfassenderen Dateiverlauf.

Update: Seit ich diesen Artikel geschrieben habe, hat Azure DevOps Services eine Reihe großartiger Verlaufsanzeigeoptionen im Web eingeführt. Dies bedeutet, dass Sie die Datei, für die Sie den Verlauf anzeigen möchten, einfach in unserem Explorer abrufen können, wenn Sie nicht durch die Befehlszeile gehen möchten, und Sie werden dem folgenden Verlaufsfilter angezeigt, in dem Sie einfache oder nicht einfache Verlaufsansichten angeben können:

Git-Filter

(c) 2016 Microsoft Corporation. Alle Rechte vorbehalten. Dieses Dokument wird "as-is" bereitgestellt." Informationen und Ansichten, die in diesem Dokument ausgedrückt werden, einschließlich URL- und anderer Internetwebsiteverweise, können sich ohne vorherige Ankündigung ändern. Sie tragen das Risiko, sie zu verwenden.

Mit diesem Dokument erhalten Sie keinerlei Rechte an geistigem Eigentum in einem beliebigen Microsoft-Produkt. Sie können dieses Dokument als Kopie für eigene interne Referenzzwecke verwenden.