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 diffpara ver o resultado.
Depois está tudo feito com o seu mudanças a applyaparência boa e você está certo, você não precisa a muamba qualquer mais- então usar git stash droppara se livrar dele.
Eu sempre sugiro usar git stash applyao invés de git stash pop. A diferença é que applydeixa o esconderijo para facilitar a tentativa de apply, ou para olhar, etc. Se popfor capaz de extrair o esconderijo, ele também dropo 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 droppara 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 savenovamente, como git stashfaz 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 dropsolta 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 applye, em seguida, dropum 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-Decembersignificam muito mais para mim do que stash@{12}. (O git stashcomando 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 adde / ou git rmantes 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-indexpara 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 applyoperação examina o que o commit mudou e tenta repeti-lo onde quer que você esteja agora. O estoque ainda estará lá ( applymantém-o por perto), para que você possa ver mais ou decidir que esse era o lugar errado applye tentar novamente de forma diferente ou o que quer que seja.
Sempre que você tiver um stash, poderá usar git stash show -ppara 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 --indexrestauradas 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 applycomando 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 applyoperações, é fácil voltar atrás: use git reset --hardpara voltar ao estado limpo e alterar suas applyoperaçõ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 branchserve.
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 --indexfaz é simples de explicar, mas um pouco complicado internamente:
- Quando você tem alterações, é necessário
git add(ou "estágio") antes da commiting.
- Portanto, quando você executou
git stash, pode ter editado os dois arquivos fooe zorg, mas apenas testado, um deles.
- Portanto, quando você pede para recuperar o estoque, pode ser bom se forem
git addas addcoisas ed e não git add as não adicionadas. Ou seja, se você addeditou, foomas não zorgvoltou 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 --indexbandeira para applytenta 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 applyoperaçã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 --indexfacilita muito a execução git stash apply.