Git
Português (Brasil) ▾ Topics ▾ Latest version ▾ git-stash last updated in 2.33.0

NOME

git-stash - Acumula as alterações em um outro diretório de trabalho

RESUMO

git stash list [<opções>]
git stash show [<opções>] [<stash>]
git stash drop [-q|--quiet] [<stash>]
git stash ( pop | apply ) [--index] [-q|--quiet] [<stash>]
git stash branch <nome-do-ramo> [<stash>]
git stash [push [-p|--patch] [-k|--[no-]keep-index] [-q|--quiet]
	     [-u|--include-untracked] [-a|--all] [-m|--message <mensagem>]
	     [--pathspec-from-file=<arquivo> [--pathspec-file-nul]]
	     [--] [<pathspec>…​]]
git stash clear
git stash create [<mensagem>]
git stash store [-m|--message <mensagem>] [-q|--quiet] <commit>

DESCRIÇÃO

Use o comando git stash quando quiser gravar a condição atual do diretório ativo e do índice, porém queira voltar para um diretório funcional limpo. O comando salva as suas alterações locais e reverte o diretório de trabalho para coincidir ao commit HEAD.

As alterações armazenadas por este comando podem ser listadas com o comando git stash list, inspecionadas com o comando git stash show e restauradas (potencialmente em cima de um commit diferente) com o comando git stash apply. Chamar o comando git stash sem argumentos é o equivalente que executar o comando git stash push. É predefinido que um "stash" seja listado como "WIP no nomedoramo …​", porém você pode fornecer uma mensagem mais descritiva na linha de comando durante a criação de um.

O último "stash" que você criou é armazenado em refs/stash; os "stash" mais antigos são encontrados no "reflog" desta referência e podem ser nomeados usando a sintaxe usual do "reflog" (como, por exemplo, stash@{0} é o "stash" criado mais recentemente, o stash@{1} é o anterior, o stash@{2.hours.ago} também é possível). As pilhas "stash" também podem ser referenciadas definindo apenas o índice "stash" (como, por exemplo, o número inteiro n é o equivalente a um stash@{n}).

COMANDOS

push [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [-m|--message <mensagem>] [--pathspec-from-file=<arquivo> [--pathspec-file-nul]] [--] [<pathspec>…​]

Salva as suas alterações locais em uma novo lançamento na stash e reverta-as para HEAD (na árvore de trabalho e no índice). A parte da <mensagem> é opcional e dá a descrição junto com a condição do empilhamento.

Para fazer um instantâneo de forma rápida, você pode omitir o "push". Neste modo, os argumentos não opcionais não são permitidos, visam impedir que um subcomando com erro de ortografia faça uma entrada na pilha indesejada. As duas exceções são stash -p, que atua como um alias para o stash push -p e os elementos pathspec, que são permitidos após um hífen duplo -- para desambiguação.

save [-p|--patch] [-k|--[no-]keep-index] [-u|--include-untracked] [-a|--all] [-q|--quiet] [<mensagem>]

Esta opção já está obsoleta em favor da opção git stash push. Difere do "stash push", pois não pode lidar com o pathspec. Em vez disso, todos os argumentos não opcionais são concatenados para formar a mensagem "stash".

list [<opções>]

Lista as entradas acumuladas (stash) que você possui atualmente. Cada entrada stash é listada com o seu nome (como por exemplo, stash@{0} é o lançamento mais recente, stash@{1} é o lançamento anterior etc.), o nome do ramo que estava atual quando o foi feito um lançamento e uma breve descrição do commit onde a entrada teve base.

stash@{0}: WIP on submit: 6ebd0e2... Update git-stash documentation
stash@{1}: On master: 9cc0589... Add git-stash

O comando aceita as opções aplicáveis ao comando git log para controlar o que é exibido e como. See git-log[1].

show [<opções>] [<stash>]

Exiba as alterações registradas na entrada stash como uma diferença entre o conteúdo oculto e o commit quando a entrada stash for criada. É predefinido que o comando exiba o "diffstat", porém aceite qualquer formato informado pelo comando git diff (como por exemplo, git stash show -p stash@{1} para exibir a segunda entrada mais recente em formato patch). Você pode usar as variáveis de configuração stash.showStat e/ou stash.showPatch para alterar o comportamento predefinido.

pop [--index] [-q|--quiet] [<stash>]

Remova a única condição do empilhamento da lista e aplique-o sobre a condição atual da árvore de trabalho, ou seja, faça a operação inversa do comando git stash push. O diretório de trabalho deve corresponder ao índice. O diretório de trabalho deve coincidir com o índice.

A aplicação da condição pode falhar com conflitos; neste caso, ele não é removido da lista de estoque stash. É necessário resolver os conflitos manualmente e chamar o comando git stash drop manualmente depois.

apply [--index] [-q|--quiet] [<stash>]

Como pop ', porém não remova a condição da lista de estoque 'stash'. Diferente de `pop, <stash> pode ser qualquer commit que se pareça com um commit criado através do comando stash push ou stash create.

branch <nome-do-ramo> [<stash>]

Cria e efetua a averiguação de um novo ramo chamado <nome-do-ramo> iniciando a partir do commit onde o <stash> foi criado originalmente, aplica as alterações registradas do <stash> na nova árvore de trabalho e no índice. Caso seja bem-sucedido, e <stash> for uma referência do formulário stash@{<revision>}, ele liberará o <stash>.

É útil caso o ramo onde você executou o git stash push mude o suficiente para que o` git stash apply` falhe devido aos conflitos. Como o acumulo da entrada é aplicada no topo do commit que era o HEAD no momento em que o git stash foi executado, ela restaura a condição originalmente acumulada sem os conflitos.

clear

Remova todos os lançamentos acumulados. Observe que estas entradas estarão sujeitas a remoção e podem ser impossíveis de serem recuperadas (consulte Exemplos abaixo para uma possível estratégia).

drop [-q|--quiet] [<stash>]

Remova uma única entrada stash da lista das entradas stash.

create

Crie uma entrada stash (que é um objeto commit comum) e retorne seu nome de objeto, sem armazená-la em qualquer outro lugar no espaço de nomes "ref". Isso tem a intenção de ser útil para scripts. Provavelmente não é o comando que você deseja usar; veja o "push" acima.

store

Armazene um determinado "stash" criado através do comando git stash create (que é um commit pendente de mesclagem) na "ref" determinada, atualizando o "reflog" do "stash". Isso tem a intenção de ser útil para scripts. Provavelmente não é o comando que você deseja usar; veja o "push" acima.

OPÇÕES

-a
--all

Esta opção só é válida para os comandos push e save.

Todos os arquivos ignorados e não monitorados também são armazenados em cache e limpos com o comando git clean.

-u
--include-untracked

Esta opção só é válida para os comandos push e save.

Todos os arquivos que não sejam monitorados também são escondidos e limpos com o git clean.

--index

Esta opção só é válida para os comandos pop e apply.

Tenta restabelecer não apenas as alterações da árvore de trabalho, mas também as do índice. No entanto, isso pode falhar quando há conflitos (que são armazenados no índice e portanto, não é mais possível aplicar as alterações como eram originalmente).

-k
--keep-index
--no-keep-index

Esta opção só é válida para os comandos push e save.

Todas as alterações que já foram adicionadas ao índice não são alteradas.

-p
--patch

Esta opção só é válida para os comandos push e save.

Selecione a diferença entre os blocos interativamente entre HEAD e a árvore de trabalho a serem estocados. The stash entry is constructed such that its index state is the same as the index state of your repository, and its worktree contains only the changes you selected interactively. The selected changes are then rolled back from your worktree. Consulte a seção “Modo Interativo” do git-add[1] para aprender como operar o modo --patch.

A opção --patch implica no uso da opção --keep-index. Você pode usar a --no-keep-index para substituir isso.

--pathspec-from-file=<arquivo>

Esta opção só é válida para o comando push.

O "pathspec" é passado com <arquivo> em vez dos argumentos da linha de comando. Caso o <arquivo> seja exatamente -, a entrada padrão será utilizada. Os elementos do "pathspec" são separados por caracteres de término de linha LF ou CR/LF. Os elementos do "pathspec" podem ser citados conforme explicado na variável de configuração core.quotePath (consulte git-config[1]). Consulte também opção --pathspec-file-nul e o global --literal-pathspecs.

--pathspec-file-nul

Esta opção só é válida para o comando push.

Só faz algum sentido caso seja utilizado junto com a opção --pathspec-from-file. Os elementos "pathspec" são separados com caracteres NUL e todos os outros caracteres são considerados de forma literal (incluindo as novas linhas e as citações).

-q
--quiet

Esta opção só é válida para os comandos apply, drop, pop, push, save e store.

Silencioso, suprima as mensagens de feedback.

--

Esta opção só é válida para o comando push.

Separa o pathspec das opções para fins de desambiguação.

<pathspec>…​

Esta opção só é válida para o comando push.

A nova entrada stash registra as condições alteradas apenas para os arquivos que coincidam com o pathspec. As entradas de índice e os arquivos da árvore de trabalho são revertidos para a condição no HEAD apenas para estes arquivos, deixando também os arquivos que não correspondem ao pathspec intactos.

Para mais detalhes sobre a sintaxe <pathspec>, veja a entrada pathspec em gitglossary[7].

<stash>

Esta opção só é válida para os comandos apply, branch, drop, pop e show.

Uma referência do formulário stash@{<revisão>}. Quando nenhum <stash> é informado, o último "stash" é assumido (ou seja, stash@{0}).

DISCUSSÃO

Uma o lançamento no estoque stash é representado como um commit cuja árvore registra a condição do diretório de trabalho e a sua primeira origem é o commit no HEAD quando a entrada foi criada. A árvore da segunda origem registra a condição do índice quando o lançamento é feito, e é feito um herdeiro do commit HEAD. O grafo de ascendência fica assim:

       .----W
      /    /
-----H----I

onde H é o commit HEAD, I é um commit que registra a condição do índice e W é um commit que registra a condição da árvore de trabalho.

EXEMPLOS

Obtendo de um diretório sujo

Quando você está no meio de alguma coisa, aprende que há alterações upstream que são possivelmente relevantes para o que você está fazendo. Quando as suas alterações locais não entrarem em conflito com as alterações na "upstream", um simples git pull permitirá que você avance.

No entanto, há casos onde as suas alterações locais entram em conflito com as alterações na upstream, e o git pull se recusa a sobrescrever as suas alterações. Nesse caso, é possível ocultar as suas alterações, executar um pull e remover da pilha, da seguinte maneira:

$ git pull
 ...
file foobar not up to date, cannot merge.
$ git stash
$ git pull
$ git stash pop
Fluxo de trabalho interrompido

Quando você está no meio de alguma coisa, seu chefe entra e exige que você conserte algo imediatamente. Tradicionalmente, você faria um commit em um ramo temporário para armazenar as suas alterações e retornava ao ramo original para fazer a correção de emergência, assim:

# ... hack hack hack ...
$ git switch -c my_wip
$ git commit -a -m "WIP"
$ git switch master
$ edit emergency fix
$ git commit -a -m "Arruma na pressa"
$ git switch my_wip
$ git reset --soft HEAD^
# ... continue a hackear ...

Você pode utilizar o comando git stash para simplificar o exemplo acima:

# ... hack hack hack ...
$ git stash
$ edit emergency fix
$ git commit -a -m "Arrumando na correria"
$ git stash pop
# ... continue a hackear ...
Testando commits parciais

Você pode utilizar o comando git stash push --keep-index quando quiser fazer dois ou mais commits das alterações na árvore de trabalho e queira testar cada uma das alterações antes de fazer o commit:

# ... hack hack hack ...
$ git add --patch foo            # adiciona apenas a primeira parte ao índice
$ git stash push --keep-index    # acumule todas as outras modificações
$ edit/build/test first part
$ git commit -m 'First part'     # faça o commit completo de todas as modificações testadas
$ git stash pop                  # prepare para trabalhar em todas as outras modificações
# ... repita os cinco passos acima até que sobre apenas um commit ...
$ edit/build/test remaining parts
$ git commit foo -m 'Partes resultantes'
Recuperando entradas stash que foram limpas/eliminadas erroneamente

Caso você derrube ou limpe as entradas stash por engano, elas não poderão mais ser recuperadas pelos mecanismos de segurança normais. No entanto, é possível tentar o seguinte encantamento para obter uma lista das entradas stash que ainda estão em seu repositório, mas que não são mais acessíveis:

git fsck --unreachable |
grep commit | cut -d\  -f3 |
xargs git log --merges --no-walk --grep=WIP

GIT

Parte do conjunto git[1]