Por que o estoque oculto do Git precisa de dois pais?

8

Por que o estoque oculto do Git precisa de dois pais?

No Hacker's Guide to Git , vejo esse modelo mental para esconderijos:

insira a descrição da imagem aqui

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.

Patrick Szalapski
fonte

Respostas:

6

Porque duas coisas estão ocultas: o conteúdo indexado e o conteúdo da árvore de trabalho. Ambos são derivados do commit do check-out. Ao abrir o esconderijo, ambos podem ser restaurados.

jthill
fonte
Portanto, as mudanças em B foram confirmadas, mas não forçadas, e as mudanças em C não foram confirmadas nem forçadas. Isso está certo?
Patrick Szalapski
Não, o conteúdo em B foi adicionado aka encenado, mas não confirmado; o conteúdo em C estava na sua árvore de trabalho.
jthill
Ainda não tenho certeza sobre C, então: qual é o conteúdo aqui que difere de B?
Patrick Szalapski
Qualquer coisa que você mudou, mas não mudou git add.
jthill
1
Suas alterações de trabalho (rastreadas, mas não adicionadas) devem com certeza ser mantidas; essa é a intenção de ocultar essas alterações, certo? Mais tarde, você decide colocar o esconderijo ou descartá-lo ou deixá-lo.
vgoff
2

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 Hrepresenta 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 -uopção para o stashcomando, que instrui o Git a esconder também arquivos não rastreados. O diagrama agora se torna:

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

O novo Ucommit 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 Sagora tem três pais: H, Ie Ue 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}.

Samir Aguiar
fonte