Warum braucht Gits Stash Commit zwei Eltern?
Im Hacker's Guide to Git sehe ich dieses mentale Modell für Verstecke:
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.
git add
.Es sind nicht immer zwei Eltern erforderlich, manchmal sind tatsächlich drei erforderlich.
Das folgende Diagramm zeigt das einfachste Szenario mit zwei Elternteilen:
Hier wird
H
Ihr aktueller Kopf dargestellt, der in Ihrem Beispiel der Hauptzweig ist, und beim Ausführen werden zwei untergeordnete Commits erstelltgit-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
-u
Schalter für denstash
Befehl bereitstellen , der Git anweist, auch nicht verfolgte Dateien zu speichern. Das Diagramm wird nun:Das neue
U
Commit 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 sindHEAD
. Das Versteck begehenS
hat jetzt drei Eltern:H
,I
undU
jetzt , 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ührengitk stash@{0}
.quelle