Preciso saber no meu script se um determinado commit é um commit padrão ou uma entrada stash. O método deve funcionar também para stashes descartados que ainda não foram coletados como lixo, portanto, não pode depender da verificação de sha de entradas de stash existentes (como git rev-parse stash@{X}
).
relate perguntas
-
Acidentalmente, cliquei em um botão que excluiu todos os commits feitos para um site, mas tenho um backup no meu computador - como restaurar? [fechado]
-
Modificando autores e utilizando Git Rebase em fluxos de trabalho colaborativos
-
Como imprimir facilmente as informações padrão do autor do Git?
-
Qual é a maneira certa de extrair minhas alterações do gitlab para o servidor remoto?
-
Posso rebasear e mesclar uma solicitação pull para uma ramificação que bloqueia push e commits não assinados?
Um commit stash tem 2 pais. Diga
parent1
eparent2
.parent1
também é o único pai deparent2
. O gráfico é assim,Atualizar :
Como aponta @jthill, com
git stash -u
o qual também armazena arquivos não rastreados, o head tem um terceiro pai,parent3
.parent3
é um commit raiz.As mensagens de commit deles correspondem a certos padrões. A mensagem da entrada stash começa com
WIP on $branch:
(bygit stash
) ouOn $branch:
(bygit stash push -m $msg
), seguida pelo sha1sum curto e pelo assuntoparent1
. A mensagem deparent2
começa comindex on $branch:
, seguida pelo sha1sum curto e pelo assunto deparent1
. A mensagem deparent3
também corresponde a um padrãountracked files on $branch
. Em um HEAD desanexado,$branch
é literal(no branch)
.Podemos forjar 3 ou 4 commits com o mesmo gráfico e mensagens em um branch normal, e o head também pode ser consumido por
git stash apply $commit
. Mas não é comum em logs reais. Portanto, se os 3 ou 4 commits corresponderem ao gráfico e suas mensagens de commit corresponderem a esses padrões, o head pode ser considerado uma entrada stash.