Non sempre richiede due genitori, a volte in realtà ne richiede tre. ;)
Il seguente diagramma illustra lo scenario più semplice, con due genitori:
.----W
/ /
-----H----I
Quando si fa un git stash
, Git crea due commit: il primo è un commit che applica le modifiche nascoste al commit HEAD corrente ( I
). Questo è il commit che registra i file nell'indice. L'indice prima della memorizzazione ha tutti i file nell'HEAD più quelli (aggiunti) a fasi, ecco perché commit I
è figlio di H
(commit puntato da HEAD
).
Il secondo ( W
) è figlio di quel commit e del commit puntato da HEAD. Questo è il commit stash, che viene utilizzato per applicare lo stash.
Ora, l'altro scenario si verifica quando fornisci l'opzione -u
al comando stash
. Questo dice a Git di mettere anche i file non tracciati. Lo schema ora diventa:
.----W----.
/ / /
-----H----I U
Il nuovo commit U
ha tutte le modifiche introdotte dai file non tracciati. Si noti che non avrebbe senso che questo commit avesse genitori in quanto tali file non esistono nell'attuale HEAD
.
Puoi vedere chiaramente quei diagrammi e le differenze eseguendo qualcosa come git log --graph stash@{0}
o gitk stash@{0}
.