Fundamentos de Programação/02 - Código que Presta/Semana 08 - Git Além do Básico4 min
Stash
popvsapply: qual a diferença e qual é a mais segura?- Stash inclui arquivos não rastreados por padrão? E ignorados?
- Por que stash acumulado por semanas é lixo disfarçado de segurança?
- Quando um branch temporário ("wip") é melhor que um stash?
Conceito
Stash guarda as mudanças não comitadas e limpa o diretório de trabalho. Serve para interromper o que você está fazendo sem comitar coisa pela metade.
Por baixo, um stash é um commit (na verdade um merge commit com dois ou três pais)
guardado em refs/stash. É por isso que ele aparece no 4. Reflog e é recuperável mesmo
depois de descartado.
pop vs apply — e apply é a mais segura:
apply |
pop |
|
|---|---|---|
| Aplica as mudanças | sim | sim |
| Mantém o stash guardado | sim | não |
| Se der conflito na aplicação | você ainda tem o stash | em versões antigas você podia perder |
apply seguido de drop manual é pop com uma rede de segurança. Em conflito, apply te
deixa com o stash intacto para tentar de novo de outra forma.
O que entra no stash por padrão — e a resposta surpreende:
| Tipo de arquivo | Entra? | Flag |
|---|---|---|
| modificações em arquivos rastreados | sim | padrão |
| arquivos novos (untracked) | não | -u |
arquivos ignorados (.gitignore) |
não | -a |
Stash acumulado é lixo disfarçado de segurança. Sem mensagem, o stash@{7} é uma caixa
sem etiqueta. Você não vai lembrar o que era, não vai apagar (e se fosse importante?), e ele
vai ficar lá. Se você tem mais de dois ou três stashes, eles já não são um mecanismo de
interrupção — são um cemitério.
Quando uma branch temporária é melhor: para qualquer coisa que você vai guardar por
mais de uma hora. Branch tem nome, aparece no git branch, sobrevive a gc, e pode ser
empurrada. Stash é para minutos.
Na prática
apply contra pop, verificado:
$ git stash # arquivo volta ao estado comitado
arquivo: a | stashes: 1
$ git stash apply
arquivo: modificado | stashes ainda guardados: 1 <- CONTINUA lá
$ git stash pop
arquivo: modificado | stashes restantes: 0 <- consumido
E o untracked, que é a pegadinha mais comum:
$ echo novo > novo.txt
$ git stash
novo.txt ainda existe? SIM <- NÃO foi guardado
$ git stash -u
novo.txt existe? NAO <- agora sim
A consequência prática: se você faz git stash achando que limpou tudo e roda o build, os
arquivos novos ainda estão lá contaminando o resultado.
Respostas às perguntas-guia
1. pop vs apply: qual a diferença e qual é a mais segura?
pop = aplica e remove; apply = aplica e mantém. apply é a mais segura — em
caso de conflito na aplicação, você ainda tem o stash guardado. O idioma seguro é
apply, conferir, e git stash drop depois.
2. Stash inclui arquivos não rastreados por padrão? E ignorados?
Não e não. Verificado acima. -u inclui untracked, -a inclui ignorados também.
3. Por que stash acumulado por semanas é lixo disfarçado de segurança?
Porque não tem etiqueta, não tem contexto, e cria a ilusão de que o trabalho está salvo. Na
prática ninguém volta a um stash de duas semanas — e ninguém apaga, por medo. Use
git stash push -m "descrição" quando for inevitável, e prefira branch.
4. Quando um branch temporário ("wip") é melhor que um stash?
Sempre que a interrupção passar de minutos. Branch tem nome, é listável, é empurrável e não depende do seu diretório de trabalho:
git switch -c wip/investiga-timeout
git commit -am "wip: reproduz o timeout"
Isso também aparece no git log e no reflog, então é recuperável de mais formas.
Armadilhas
git stashnão guarda untracked — a mais custosa, porque o build "limpo" não estava limpo.- Stash não é por branch. Ele é global no repo: você guarda numa branch e pode aplicar em outra por acidente.
git stash clearé irreversível na prática — os stashes ficam inalcançáveis e ogcos remove. Recuperável só viagit fsck --unreachableantes dogc.- Conflito ao aplicar deixa o diretório em estado de conflito, e com
popo stash já foi consumido em versões antigas do git. - Stash em rebase/merge em andamento confunde tudo. Termine a operação antes.
Comandos essenciais
git stash push -m "o que era" # COM mensagem, sempre
git stash -u # inclui arquivos novos
git stash -a # inclui ignorados também
git stash push -- caminho/arquivo # guarda só um caminho
git stash list # o que existe
git stash show -p stash@{1} # o diff de um stash específico
git stash apply stash@{1} # aplica sem remover
git stash drop stash@{1} # remove depois de conferir
git stash branch nome-novo # cria branch a partir do stash e aplica
git fsck --unreachable | grep commit # último recurso após clear
git stash branch é o comando mais subestimado: ele resolve o caso "esse stash virou
trabalho de verdade" convertendo em branch, com o stash aplicado.
Relacionado
- 4. Reflog — como recuperar stash descartado
- 1. Rebase vs Merge — termine a operação antes de mexer no stash
- 6. Resolução de Conflitos — aplicar stash pode conflitar
Parte de Semana 08 - Git Além do Básico · 00 - MOC Fundamentos de Programação