Por que o estoque oculto do Git precisa de dois pais?
No Hacker's Guide to Git , vejo esse modelo mental para esconderijos:
O guia diz que stash @ {0} precisa de A e B como pais. Por quê? Por que o estoque não aponta apenas para B, se livrando da necessidade de C? Acho que estou perdendo algo na minha compreensão do Git.
git add
.Nem sempre exige dois pais, às vezes exige três.
O diagrama a seguir ilustra o cenário mais simples, com dois pais:
Aqui
H
representa o seu cabeçalho atual, que é o ramo principal no seu exemplo, e dois commits filhos são criados quando você executagit-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 ostash
comando, que instrui o Git a esconder também arquivos não rastreados. O diagrama agora se torna: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 momentoHEAD
. O esconderijo cometerS
agora tem três pais:H
,I
eU
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}
ougitk stash@{0}
.fonte