Respostas:
Quando tenho de aplicar alterações ocultas em uma cópia de trabalho suja, por exemplo, retire mais de um conjunto de alterações do stash, uso o seguinte:
$ git stash show -p | git apply -3 && git stash drop
Basicamente
Eu me pergunto por que não há -f
opção (força) para a git stash pop
qual deveria se comportar exatamente como o one-liner acima.
Enquanto isso, você pode adicionar esse one-liner como um alias do git:
$ git config --global --replace-all alias.unstash \
'!git stash show -p | git apply -3 && git stash drop'
$ git unstash
Agradecemos ao @SamHasler por apontar o -3
parâmetro que permite resolver conflitos diretamente por meio da mesclagem de 3 vias.
git stash apply
não aplicará as alterações ocultas se você tiver uma cópia de trabalho suja. Então você pode ver git stash show -p | git apply
como se aplica algum tipo de esconderijo forçado.
error: <file> does not match index
em todos os arquivos modificados. No entanto, outra solução funcionou.
Eu faço assim:
git add -A
git stash apply
e então (opcionalmente):
git reset
git add -u
, que é como, -A
exceto que não adiciona arquivos não rastreados.
Você pode fazer isso sem precisar esconder suas alterações atuais, exportando o esconderijo que deseja como um arquivo de patch e aplicando-o manualmente.
Por exemplo, suponha que você queira aplicar stash @ {0} a uma árvore suja:
Exporte stash @ {0} como um patch:
git stash show -p stash @ {0}> Stash0.patch
Aplique manualmente as alterações:
git aplica Stash0.patch
Se a segunda etapa falhar, você precisará editar o arquivo Stash0.patch para corrigir os erros e tentar o git apply novamente.
Limpe seu diretório de trabalho com git reset, confirme as alterações ou, se você deseja ocultar as alterações atuais, tente:
$ git stash save "descrição das alterações atuais" $ git stash pop stash @ {1}
Isso esconderá as alterações atuais e, em seguida, exibirá o segundo esconderijo da pilha escondida.
A solução de Mathias é definitivamente a mais próxima de um pop stash do git --force (e realmente, vamos devs do Git, vamos pegar essa opção já!)
No entanto, se você quiser fazer o mesmo usando apenas os comandos git, poderá:
Em outras palavras, faça um commit (que nunca iremos enviar) de suas alterações atuais. Agora que seu espaço de trabalho está limpo, coloque seu estoque. Agora, confirme as alterações do stash como uma emenda ao seu commit anterior. Feito isso, agora você tem os dois conjuntos de alterações combinados em uma única confirmação ("Fixme"); apenas redefina (--soft NOT --hard para que nada seja realmente perdido) seu checkout para "um antes desse commit", e agora você tem os dois conjuntos de alterações completamente não confirmados.
** EDIT * *
Acabei de perceber que é realmente ainda mais fácil; você pode pular completamente a etapa 3, então ...
(Confirme as alterações atuais, retire as alterações ocultas, redefina a primeira confirmação para obter os dois conjuntos de alterações combinados em um estado não confirmado.)
Nenhuma dessas respostas realmente funciona se você se encontrar nessa situação como eu fiz hoje. Independentemente de quantos git reset --hard
eu fiz, isso não me levou a lugar algum. Minha resposta (não oficial de forma alguma foi):
git reflog --all
Também achei a solução de Mathias Leppich excelente, então adicionei um alias para ela no meu arquivo .gitconfig global
[alias]
apply-stash-to-dirty-working-tree = !git stash show -p | git apply && git stash drop
Agora eu posso apenas digitar
git apply-stash-to-dirty-working-tree
o que funciona muito bem para mim.
(Sua milhagem pode variar com esse longo nome alternativo. Mas eu gosto de uma dose de verbosidade quando se trata de conclusão do bash.)
Você pode aplicar um stash a uma árvore "suja" fazendo um git add
para realizar as alterações feitas, limpando a árvore. Em seguida, você pode git stash pop
aplicar as alterações ocultas, sem problemas.
Você tem arquivos que foram modificados, mas não confirmados. Ou:
git reset --hard HEAD (to bring everything back to HEAD)
ou, se você quiser salvar suas alterações:
git checkout -b new_branch
git add ...
git commit
git checkout -b old_branch
git stash pop
Eu tive o mesmo problema, mas o git tinha zero arquivos alterados. Acontece que eu tinha um arquivo index.lock que estava por aí. A exclusão resolveu o problema.
Não consegui fazer a maioria delas funcionar; por alguma razão, sempre acha que tenho alterações locais em um arquivo. Não consigo aplicar um stash, os patches não se aplicam checkout
e reset --hard
falham. O que finalmente funcionou foi salvar o esconderijo como um ramo e git stash branch tempbranchname
, em seguida, fazer uma mesclagem normal de ramos: git checkout master
e git merge tempbranchname
. Em http://git-scm.com/book/en/Git-Tools-Stashing :
Se você quiser uma maneira mais fácil de testar as alterações armazenadas novamente, execute o branch git stash, que cria um novo branch para você, verifique o commit em que estava quando você armazenou seu trabalho, aplique-o novamente e solte o botão esconder se for aplicado com sucesso
git stash show -p | git apply
diferente degit stash apply
?