Warum braucht Gits Stash Commit zwei Eltern?

8

Warum braucht Gits Stash Commit zwei Eltern?

Im Hacker's Guide to Git sehe ich dieses mentale Modell für Verstecke:

Geben Sie hier die Bildbeschreibung ein

Der Leitfaden sagt mir, dass stash @ {0} sowohl A als auch B als Eltern benötigt. Warum? Warum zeigt der Vorrat nicht einfach auf B, um die Notwendigkeit von C loszuwerden? Ich glaube, mir fehlt etwas in meinem Git-Verständnis.

Patrick Szalapski
quelle

Antworten:

6

Weil zwei Dinge versteckt sind: der indizierte Inhalt und der Arbeitsbauminhalt. Beide werden aus dem ausgecheckten Commit abgeleitet. Wenn Sie den Vorrat öffnen, können beide wiederhergestellt werden.

jthill
quelle
Die Änderungen in B wurden also festgeschrieben, aber nicht gepusht, und die Änderungen in C wurden weder festgeschrieben noch gepusht. Ist das richtig?
Patrick Szalapski
Nein, der Inhalt in B wurde hinzugefügt, auch bekannt als inszeniert, aber nicht festgeschrieben. Der Inhalt in C befand sich in Ihrem Arbeitsbaum.
Bis zum
Immer noch nicht sicher über C: Was ist der Inhalt hier, der sich von B unterscheidet?
Patrick Szalapski
Alles, was du geändert hast, aber nicht git add.
Bis zum
1
Ihre Arbeitsänderungen (nachverfolgt, aber nicht hinzugefügt) sollten auf jeden Fall beibehalten werden. Das ist die Absicht, diese Änderungen zu verbergen, oder? Später entscheiden Sie sich, den Vorrat zu öffnen oder wegzuwerfen oder ihn zu verlassen.
VGoff
2

Es sind nicht immer zwei Eltern erforderlich, manchmal sind tatsächlich drei erforderlich.

Das folgende Diagramm zeigt das einfachste Szenario mit zwei Elternteilen:

       .----S
      /    /
-----H----I

Hier wird HIhr aktueller Kopf dargestellt, der in Ihrem Beispiel der Hauptzweig ist, und beim Ausführen werden zwei untergeordnete Commits erstellt git-stash.

Der erste ist I, der den Index zum Zeitpunkt des Versteckens darstellt. Mit anderen Worten, diese verpflichten enthält die Änderungen , die wurden inszeniert vor stashing. Es hat einen alleinerziehenden Elternteil, auf den HEAD hingewiesen hat. Das zweite ( S) ist das Stash-Commit, das Dateien enthält, die vor dem Stashing geändert wurden. Es gibt zwei Commits, da sich die Änderungen möglicherweise zusätzlich zu denen in I und H ändern, dh sie können sich auf Dateien auswirken, die bereitgestellt wurden oder nicht.

Das andere Szenario tritt auf, wenn Sie den -uSchalter für den stashBefehl bereitstellen , der Git anweist, auch nicht verfolgte Dateien zu speichern. Das Diagramm wird nun:

       .----S----.
      /    /    /
-----H----I    U

Das neue UCommit enthält alle Änderungen, die durch die nicht verfolgten Dateien eingeführt wurden. Beachten Sie, dass es für dieses Commit keinen Sinn macht, Eltern zu haben, da diese Dateien im aktuellen nicht vorhanden sind HEAD. Das Versteck begehen Shat jetzt drei Eltern: H, Iund Ujetzt , wenn die Stash Anwendung begeht Git wird auch die untracked Änderungen zu übernehmen.

Sie können diese Diagramme und die Unterschiede deutlich sehen, indem Sie so etwas wie git log --graph stash@{0}oder ausführen gitk stash@{0}.

Samir Aguiar
quelle