A resposta fácil para a pergunta fácil é git stash apply
Basta verificar a ramificação na qual deseja alterar e, em seguida git stash apply
. Então use git diff
para ver o resultado.
Depois está tudo feito com o seu mudanças a apply
aparência boa e você está certo, você não precisa a muamba qualquer mais- então usar git stash drop
para se livrar dele.
Eu sempre sugiro usar git stash apply
ao invés de git stash pop
. A diferença é que apply
deixa o esconderijo para facilitar a tentativa de apply
, ou para olhar, etc. Se pop
for capaz de extrair o esconderijo, ele também drop
o fará imediatamente , e se você perceber de repente que queria extraí-lo em algum lugar mais (em um ramo diferente), ou com --index
, ou algo assim, não é tão fácil. Se você apply
, você escolhe quando drop
.
É tudo bem menor, de um jeito ou de outro, e para um novato, deve ser o mesmo. (E você pode pular todo o resto!)
E se você estiver fazendo coisas mais avançadas ou mais complicadas?
Existem pelo menos três ou quatro diferentes "maneiras de usar o git stash", por assim dizer. O texto acima é para "caminho 1", o "caminho fácil":
Você começou com uma ramificação limpa, estava trabalhando em algumas alterações e depois percebeu que estava fazendo-as na ramificação errada. Você só quer fazer as alterações que você tem agora e "movê-las" para outro ramo.
Este é o caso fácil, descrito acima. Corra git stash save
(ou simplesmente git stash
, a mesma coisa). Confira o outro ramo e use git stash apply
. Isso faz com que o git se mescle em suas alterações anteriores, usando o mecanismo de mesclagem bastante poderoso do git. Inspecione os resultados com cuidado (com git diff
) para ver se você gosta deles e, se quiser, use git stash drop
para soltar o estoque. Você Terminou!
Você iniciou algumas alterações e as ocultou. Então você mudou para outro ramo e iniciou mais alterações, esquecendo que tinha as escondidas.
Agora você deseja manter ou até mover essas mudanças e aplicar seu estoque também.
Você pode de fato git stash save
novamente, como git stash
faz uma "pilha" de alterações. Se você fizer isso, terá dois esconderijos, um chamado stash
- mas você também pode escrever stash@{0}
- e outro escrito stash@{1}
. Use git stash list
(a qualquer momento) para ver todos eles. O mais novo é sempre o número mais baixo. Quando você git stash drop
solta o mais novo e o que foi stash@{1}
movido para o topo da pilha. Se você tivesse ainda mais, o que era stash@{2}
se tornaria stash@{1}
, e assim por diante.
Você pode apply
e, em seguida, drop
um estoque específico também: git stash apply stash@{2}
e assim por diante. Soltar um estoque específico, renumera apenas os de maior número. Novamente, aquele sem número também é stash@{0}
.
Se você empilhar muitos stashes, pode ficar bastante confuso (era o stash que eu queria stash@{7}
ou era stash@{4}
? Espere, eu apenas empurrei outro, agora são 8 e 5?). Pessoalmente, prefiro transferir essas alterações para um novo ramo, porque os ramos têm nomes e cleanup-attempt-in-December
significam muito mais para mim do que stash@{12}
. (O git stash
comando recebe uma mensagem opcional de salvamento e eles podem ajudar, mas de alguma forma, todos os meus stashes acabam nomeados WIP on branch
.)
(Extra avançado) Você usou git stash save -p
, ou bits específicos do seu código com cuidado git add
e / ou git rm
antes de executar git stash save
. Você tinha uma versão na área de índice / armazenamento temporário, e outra versão (diferente) na árvore de trabalho. Você quer preservar tudo isso. Então agora você usa git stash apply --index
, e isso às vezes falha com:
Conflicts in index. Try without --index.
Você está usando git stash save --keep-index
para testar "o que será comprometido". Este está além do escopo desta resposta; veja esta outra resposta StackOverflow .
Para casos complicados, recomendo começar primeiro em um diretório de trabalho "limpo", confirmando as alterações que você possui agora (em uma nova ramificação, se desejar). Dessa forma, o "lugar" em que você os está aplicando não tem mais nada e você estará apenas tentando as alterações ocultas:
git status # see if there's anything you need to commit
# uh oh, there is - let's put it on a new temp branch
git checkout -b temp # create new temp branch to save stuff
git add ... # add (and/or remove) stuff as needed
git commit # save first set of changes
Agora você está em um ponto de partida "limpo". Ou talvez seja mais assim:
git status # see if there's anything you need to commit
# status says "nothing to commit"
git checkout -b temp # optional: create new branch for "apply"
git stash apply # apply stashed changes; see below about --index
O principal a lembrar é que o "stash" é um commit, é apenas um commit "engraçado / estranho" que não está "em um ramo". A apply
operação examina o que o commit mudou e tenta repeti-lo onde quer que você esteja agora. O estoque ainda estará lá ( apply
mantém-o por perto), para que você possa ver mais ou decidir que esse era o lugar errado apply
e tentar novamente de forma diferente ou o que quer que seja.
Sempre que você tiver um stash, poderá usar git stash show -p
para ver uma versão simplificada do que está no stash. (Esta versão simplificada examina apenas as alterações da "árvore de trabalho final", não as alterações de índice salvas que são --index
restauradas separadamente.) O comando git stash apply
, sem --index
, apenas tenta fazer essas mesmas alterações no diretório de trabalho agora.
Isso é verdade mesmo se você já tiver algumas alterações. O apply
comando tem prazer em aplicar uma ocultação a um diretório de trabalho modificado (ou pelo menos para tentar aplicá-lo). Você pode, por exemplo, fazer o seguinte:
git stash apply stash # apply top of stash stack
git stash apply stash@{1} # and mix in next stash stack entry too
Você pode escolher a ordem "aplicar" aqui, escolhendo stashes específicos para aplicar em uma sequência específica. Observe, no entanto, que cada vez que você está basicamente fazendo uma "mesclagem de git" e como a documentação de mescla adverte:
A execução do git merge com alterações não-triviais não confirmadas é desencorajada: enquanto possível, pode deixá-lo em um estado difícil de se recuperar no caso de um conflito.
Se você começar com um diretório limpo e fizer apenas várias git apply
operações, é fácil voltar atrás: use git reset --hard
para voltar ao estado limpo e alterar suas apply
operações. (É por isso que recomendo começar primeiro em um diretório de trabalho limpo, para esses casos complicados.)
E o pior caso possível?
Digamos que você esteja fazendo muitas coisas avançadas do Git, e tenha feito um stash, e queira git stash apply --index
, mas não é mais possível aplicar o stash salvo --index
, porque o ramo divergiu demais desde o momento em que você o salvou.
É para isso que git stash branch
serve.
Se vocês:
- verifique o commit exato em que estava quando fez o original e
stash
, em seguida,
- crie um novo ramo e, finalmente,
git stash apply --index
a tentativa de re-criar as mudanças definitivamente vai trabalhar. Isto é o que faz. (E depois elimina o stash desde que foi aplicado com êxito.)git stash branch newbranch
Algumas palavras finais sobre --index
(o que diabos é isso?)
O que o --index
faz é simples de explicar, mas um pouco complicado internamente:
- Quando você tem alterações, é necessário
git add
(ou "estágio") antes da commit
ing.
- Portanto, quando você executou
git stash
, pode ter editado os dois arquivos foo
e zorg
, mas apenas testado, um deles.
- Portanto, quando você pede para recuperar o estoque, pode ser bom se forem
git add
as add
coisas ed e não git add
as não adicionadas. Ou seja, se você add
editou, foo
mas não zorg
voltou antes de fazer stash
, pode ser bom ter exatamente a mesma configuração. O que foi encenado, deve ser encenado novamente; o que foi modificado, mas não organizado, deve ser modificado novamente, mas não organizado.
A --index
bandeira para apply
tenta configurar as coisas dessa maneira. Se sua árvore de trabalho estiver limpa, isso geralmente funciona. Se sua árvore de trabalho já possui itens add
, você pode ver como pode haver alguns problemas aqui. Se você deixar de fora --index
, a apply
operação não tentará preservar toda a configuração em estágios / em estágios. Em vez disso, apenas invoca o mecanismo de mesclagem do git, usando o commit da árvore de trabalho no "stash bag" . Se você não se preocupa em preservar em estágios / não estágios, deixar de fora --index
facilita muito a execução git stash apply
.