Estou tentando aplicar as alterações que eu escondi anteriormente git stash pop
e recebo a mensagem:
Cannot apply to a dirty working tree, please stage your changes
Alguma sugestão sobre como lidar com isso?
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 show -p | git apply
diferente degit stash apply
?git stash apply
não aplicará as alterações ocultas se você tiver uma cópia de trabalho suja. Então você pode vergit 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:
e então (opcionalmente):
fonte
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.
fonte
Limpe seu diretório de trabalho com git reset, confirme as alterações ou, se você deseja ocultar as alterações atuais, tente:
Isso esconderá as alterações atuais e, em seguida, exibirá o segundo esconderijo da pilha escondida.
fonte
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.)
fonte
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
fonte
Também achei a solução de Mathias Leppich excelente, então adicionei um alias para ela no meu arquivo .gitconfig global
Agora eu posso apenas digitar
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.)
fonte
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ê podegit stash pop
aplicar as alterações ocultas, sem problemas.fonte
Você tem arquivos que foram modificados, mas não confirmados. Ou:
ou, se você quiser salvar suas alterações:
fonte
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.
fonte
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
ereset --hard
falham. O que finalmente funcionou foi salvar o esconderijo como um ramo egit stash branch tempbranchname
, em seguida, fazer uma mesclagem normal de ramos:git checkout master
egit merge tempbranchname
. Em http://git-scm.com/book/en/Git-Tools-Stashing :fonte