Aprenda / Git e controle de versão

IntermediárioAula 9 de 1414 min0% da trilha

git stash e worktree: trocando de contexto sem perder trabalho

Alguém pede um hotfix urgente no meio de uma mudança inacabada — dá pra pausar sem commitar lixo nem perder nada.

Você está no meio de uma mudança que não compila ainda, e alguém pede pra corrigir um bug urgente em main agora. Trocar de branch com arquivos modificados nem sempre funciona — o git recusa o checkout se a mudança colidiria com o que já existe na outra branch. Commitar "pra guardar" cria um commit incompleto que você depois precisa desfazer. Existe uma terceira opção.

git stash — guarda as mudanças de lado, sem commitar

terminal
git stash

Isso pega todas as mudanças não commitadas (arquivos já rastreados) e guarda numa pilha separada, deixando sua branch limpa — como se você nunca tivesse mexido em nada. Agora dá pra trocar de branch, resolver o hotfix, e voltar depois.

terminal — voltando depois
git checkout feature/checkout
git stash pop     # traz de volta as mudanças guardadas E remove da pilha

Arquivos novos (untracked) não entram no stash por padrão

git stash sozinho ignora arquivos que você criou mas nunca deu git add — eles continuam ali, sem serem guardados. Se a mudança pausada incluir arquivo novo, use --include-untracked.

terminal
git stash --include-untracked
# ou, abreviado:
git stash -u

list, pop e apply — a diferença que confunde

terminal
git stash list   # mostra tudo que está guardado — dá pra ter vários stashes ao mesmo tempo

git stash pop aplica o stash mais recente e apaga ele da pilha. git stash apply aplica sem apagar — útil quando você quer levar a mesma mudança pra mais de uma branch, ou quer ter certeza de que aplicou certo antes de descartar o backup.

git worktree — duas branches ao vivo, sem clonar de novo

Stash resolve pausar rapidamente. Mas às vezes você quer literalmente trabalhar em duas branches ao mesmo tempo — rodar o app numa versão enquanto edita código em outra, sem ficar trocando de branch e reinstalando dependências toda hora. git worktree cria uma segunda pasta, ligada ao mesmo repositório .git, cada uma numa branch diferente.

terminal
git worktree add ../projeto-hotfix hotfix/login

Agora ../projeto-hotfix é uma pasta separada no disco, com seus próprios arquivos, na branch hotfix/login — mas compartilhando o mesmo histórico e configuração do repositório original. Não precisa clonar de novo, não duplica o .git inteiro.

terminal — terminando de usar
git worktree remove ../projeto-hotfix

Exercício

Você está com 2 arquivos modificados (já rastreados) e 1 arquivo novo (untracked) na branch feature/relatorio. Precisa trocar pra main agora e levar as 3 mudanças guardadas, incluindo a nova. Qual comando roda?

Quiz rápido

Por que git stash sozinho às vezes não guarda tudo que você esperava?
Qual a vantagem de git worktree sobre simplesmente trocar de branch com checkout?