trilha

Fundamentos de Programação/02 - Código que Presta/Semana 08 - Git Além do Básico4 min

Stash

Perguntas-guia
  • pop vs apply: 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 stash nã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 o gc os remove. Recuperável só via git fsck --unreachable antes do gc.
  • Conflito ao aplicar deixa o diretório em estado de conflito, e com pop o 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


Parte de Semana 08 - Git Além do Básico · 00 - MOC Fundamentos de Programação

Buscar

Busca por título, seção e texto das notas