Nem sempre exige dois pais, às vezes exige três.
O diagrama a seguir ilustra o cenário mais simples, com dois pais:
.----S
/ /
-----H----I
Aqui H
representa o seu cabeçalho atual, que é o ramo principal no seu exemplo, e dois commits filhos são criados quando você executa git-stash
.
A primeira é I
, que representa o índice no momento da ocultação. Em outras palavras, esse commit contém as alterações que foram preparadas antes da armazenagem. Ele tem um único pai, que é o commit que o HEAD apontou. O segundo ( S
) é o commit stash, que contém arquivos que foram modificados antes do stash. Possui duas confirmações porque suas alterações podem estar acima daquelas em I e em H, ou seja, elas podem afetar os arquivos que foram preparados ou não.
O outro cenário acontece quando você fornece a -u
opção para o stash
comando, que instrui o Git a esconder também arquivos não rastreados. O diagrama agora se torna:
.----S----.
/ / /
-----H----I U
O novo U
commit possui todas as alterações introduzidas pelos arquivos não rastreados. Observe que não faria sentido que esse commit tivesse pais, pois esses arquivos não existem no momento HEAD
. O esconderijo cometer S
agora tem três pais: H
, I
e U
e agora ao aplicar o esconderijo cometer Git também irá aplicar as alterações untracked.
Você pode ver esses diagramas e as diferenças claramente executando algo como git log --graph stash@{0}
ou gitk stash@{0}
.