Tive algumas alterações não confirmadas no meu ramo de desenvolvimento e as escondi usando-as git stash
, mas houve algumas que foram muito importantes entre as escondidas. Existe alguma maneira de recuperar essas alterações?
Além disso, fiz algumas alterações em cima dos arquivos de código ocultos desde então.
Existe alguma chance de recuperar as alterações ocultas em uma nova ramificação, se possível?
Respostas:
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 usegit 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 usargit stash drop
para se livrar dele.Eu sempre sugiro usar
git stash apply
ao invés degit stash pop
. A diferença é queapply
deixa o esconderijo para facilitar a tentativa deapply
, ou para olhar, etc. Sepop
for capaz de extrair o esconderijo, ele tambémdrop
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 quandodrop
.É 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 simplesmentegit stash
, a mesma coisa). Confira o outro ramo e usegit 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 (comgit diff
) para ver se você gosta deles e, se quiser, usegit 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, comogit stash
faz uma "pilha" de alterações. Se você fizer isso, terá dois esconderijos, um chamadostash
- mas você também pode escreverstash@{0}
- e outro escritostash@{1}
. Usegit 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 foistash@{1}
movido para o topo da pilha. Se você tivesse ainda mais, o que erastash@{2}
se tornariastash@{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 erastash@{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 ecleanup-attempt-in-December
significam muito mais para mim do questash@{12}
. (Ogit stash
comando recebe uma mensagem opcional de salvamento e eles podem ajudar, mas de alguma forma, todos os meus stashes acabam nomeadosWIP on branch
.)(Extra avançado) Você usou
git stash save -p
, ou bits específicos do seu código com cuidadogit add
e / ougit rm
antes de executargit 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ê usagit stash apply --index
, e isso às vezes falha com: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:
Agora você está em um ponto de partida "limpo". Ou talvez seja mais assim:
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 erradoapply
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 comandogit 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: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:
Se você começar com um diretório limpo e fizer apenas várias
git apply
operações, é fácil voltar atrás: usegit reset --hard
para voltar ao estado limpo e alterar suasapply
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:
stash
, em seguida,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:git add
(ou "estágio") antes dacommit
ing.git stash
, pode ter editado os dois arquivosfoo
ezorg
, mas apenas testado, um deles.git add
asadd
coisas ed e nãogit add
as não adicionadas. Ou seja, se vocêadd
editou,foo
mas nãozorg
voltou antes de fazerstash
, 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 paraapply
tenta configurar as coisas dessa maneira. Se sua árvore de trabalho estiver limpa, isso geralmente funciona. Se sua árvore de trabalho já possui itensadd
, você pode ver como pode haver alguns problemas aqui. Se você deixar de fora--index
, aapply
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çãogit stash apply
.fonte
git stash pop
? Ou você quer dizer: você editou alguns arquivos, mas ainda não foi executadogit stash
novamente? Ou você quer dizer algo completamente diferente?apply
usar um stash. Você não precisa fazer isso, mas torna as coisas muito mais simples para você olhar. Você pode usarrebase -i
para agrupar várias confirmações ou escolher alterações específicas, ou o que for, posteriormente.git stash apply --index
(lembre-se dos dois traços). Se você deixar de fora--index
, não é grande coisa; o único ponto--index
é manter a configuração em estágios / não-estágios. (Você provavelmente não teve nenhuma configuração especial em primeiro lugar.) Entãogit status
etc, e adicione / confirme conforme desejado etc. Quando (e somente quando) tiver terminado o stash, use-ogit stash drop
para descartá-lo.drop
oupop
) o stash, você sempre terá o código stash original seguro em uma confirmação, porque uma stash é uma confirmação! Se você deseja recuperá-lo exatamente, mas em um galho, usegit stash branch
(consulte a seção acima ou o livro Pro Git na resposta de Shunya ). Você pode, então,git checkout
esse ramo, ougit cherry-pick
a comprometer-off desse ramo, etc.vai colocar tudo de volta no lugar
conforme sugerido nos comentários, você pode usar
git stash branch newbranch
para aplicar o stash a uma nova ramificação, que é igual à execução:fonte
git stash branch newbranch
realmente fará isso; mas lembre-se de que ele cria a nova ramificação com seu pai definido para o commit que estavaHEAD
no momento em questash
foi feito. Em outras palavras, é para quando você voltar depois de algum longa sessão de corte ou qualquer outra coisa, olhar para a bagunça, e decidir "Eu deveria ter colocado isso em um ramo, ao invés de stashing" :-)Para simplificar, você tem duas opções para reaplicar seu estoque:
git stash pop
- Restaurar de volta ao estado salvo, mas exclui o stash do armazenamento temporário.git stash apply
- Restaure de volta ao estado salvo e deixe a lista de stash para possível reutilização posterior.Você pode ler com mais detalhes sobre git stashes neste artigo.
fonte
Para verificar o seu conteúdo oculto: -
aplique um stash específico não da lista de stash: -
ou para aplicar apenas o primeiro esconderijo: -
Nota: o git stash pop removerá o stash da sua lista de stash, enquanto o git stash não será aplicado. Portanto, use-os de acordo.
fonte
No mac, isso funcionou para mim:
lista de stash git (veja todos os seus stashs)
git stash apply (apenas o número que você deseja da sua lista stash)
como isso:
fonte
você pode ocultar as alterações não confirmadas usando "git stash" e fazer check-out em uma nova ramificação usando "git checkout -b" e aplicar os commits stashed "git stash apply"
fonte