Não consigo aplicar o stash de volta ao diretório de trabalho.
Pequena história:
Primeiro tentei enviar algumas alterações confirmadas, mas ele disse: "não, você não pode puxar primeiro" ... OK, então, puxarei coisas do GitHub e, em seguida, executarei minhas alterações. Quando tentei puxar, ele disse que havia alterações que seriam substituídas e que deveria armazená-las. OK, eu escondi as alterações ... fiz o pull e enviei as alterações confirmadas. Mas agora, não posso restaurar as alterações não confirmadas nas quais estava trabalhando.
Este é o erro:
MyPath/File.cs already exists, no checkout
Could not restore untracked files from stash
Com certeza ainda não entendi todos os conceitos do git, eles me confundem um pouco ... talvez eu tenha feito algo errado.
Seria ótimo se alguém pudesse me ajudar a resolver isso ... Estou pesquisando no google e tudo há mais de uma hora e ainda não encontrei uma solução.
A ajuda é muito apreciada. Obrigado!
git stash
deve ajudar a fazer backup das alterações locais rapidamente. Excluir manualmente um conjunto de arquivos para restaurá-lo interrompe o fluxo. Agit stash branch
abordagem na outra resposta parece melhor, mas ainda assim muito mais manual do que o desejado.A maneira mais segura e fácil provavelmente seria guardar as coisas novamente:
Depois, se você estiver satisfeito com o resultado, pode ligar
para remover seu esconderijo "seguro".
fonte
apply
vez depop
.pop
é uma combinação deapply
edrop
, mas sódrop
seapply
funcionou sem conflitos. Mas sim,apply
geralmente é mais seguro.Conforme mencionado por @bentolo, você pode excluir manualmente os arquivos dos quais está reclamando, alternar entre os ramos e adicioná-los de volta manualmente. Mas eu pessoalmente prefiro ficar "dentro do git".
A melhor maneira de fazer isso é converter o stash em um branch. Uma vez que é um branch, você pode trabalhar normalmente no git usando as técnicas / ferramentas normais relacionadas ao branch que você conhece e adora. Esta é na verdade uma técnica geral útil para trabalhar com stashes, mesmo quando você não tem o erro listado. Funciona bem porque um stash é realmente um commit nos bastidores (veja PS).
Converter um esconderijo em um galho
O seguinte cria um branch baseado no HEAD quando o stash foi criado e então aplica o stash (não o confirma).
Trabalhando com o "branch stash"
O que você faz a seguir depende da relação entre o stash e onde seu branch de destino (que chamarei de ORIGINALBRANCH) está agora.
Opção 1 - Rebase do branch stash normalmente (muitas mudanças desde o stash)
Se você fez muitas mudanças em seu ORIGINALBRANCH, então provavelmente é melhor tratar o STASHBRANCH como qualquer filial local. Faça o commit de suas alterações no STASHBRANCH, rebase-o em ORIGINALBRANCH, depois mude para ORIGINALBRANCH e rebase / mescle as mudanças STASHBRANCH sobre ele. Se houver conflitos, trate-os normalmente (uma das vantagens dessa abordagem é que você pode ver e resolver conflitos).
Opção 2 - Redefinir o branch original para corresponder ao stash (alterações limitadas desde o stash)
Se você apenas armazenou em stash enquanto mantém algumas alterações em staged, então efetue o commit, e tudo que você deseja fazer é obter as alterações adicionais que não estavam armazenadas em stash, você pode fazer o seguinte. Ele retornará ao seu branch e índice originais sem alterar sua cópia de trabalho. O resultado final serão suas mudanças adicionais em sua cópia de trabalho.
fundo
Stashes são commits como branches / tags (não patches)
PS, É tentador pensar em um stash como um patch (assim como é tentador pensar em um commit como um patch), mas um stash é na verdade um commit contra o HEAD quando foi criado. Quando você aplica / pop, está fazendo algo semelhante a selecioná-lo em seu branch atual. Tenha em mente que branches e tags são realmente apenas referências a commits, então de muitas maneiras, stashes, branches e tags são apenas maneiras diferentes de apontar para um commit (e seu histórico).
Às vezes é necessário, mesmo quando você não fez alterações no diretório de trabalho
PPS, você pode precisar desta técnica depois de usar o stash com --patch e / ou --include-untracked. Mesmo sem alterar os diretórios de trabalho, essas opções às vezes podem criar um stash que você não pode simplesmente aplicar de volta. Devo admitir que não entendo totalmente o porquê. Veja http://git.661346.n2.nabble.com/stash-refuses-to-pop-td7453780.html para alguma discussão.
fonte
git stash show -p
esteja ajudando lá a fazer stash -> * patch *.A solução: você precisa excluir o arquivo em questão e, em seguida, tentar esconder pop / aplicar novamente e ele deve prosseguir. Não apague outros arquivos, apenas os mencionados pelo erro.
O problema: Git é uma merda às vezes. Ao ser executado,
git stash -u
ele inclui arquivos não rastreados (legal!), Mas não remove esses arquivos não rastreados e não sabe como aplicar os arquivos não rastreados escondidos em cima das sobras (não é legal!), O que realmente torna a-u
opção bastante inútil.fonte
git stash -u
git stash show
. Essa resposta fez a lâmpada acender.Para aplicar as diferenças de código no stash como um patch, use o seguinte comando:
fonte
git stash show --patch
não contém os arquivos não rastreados.Isso já aconteceu comigo várias vezes, eu guardo arquivos não rastreados
git stash -u
que acabam sendo adicionados ao repositório e não consigo mais aplicar as alterações armazenadas.Não consegui encontrar uma maneira de forçar
git stash pop/apply
a substituição dos arquivos, então primeiro removo as cópias locais dos arquivos não rastreados que foram armazenados ( tenha cuidado, pois isso excluirá quaisquer alterações que não foram confirmadas ) e, em seguida, aplico as alterações armazenadas :Finalmente, eu uso
git status
,git diff
e outras ferramentas para verificar e adicionar de volta partes dos arquivos removidos, se houver algo faltando.Se você tiver alterações não confirmadas que deseja manter, pode criar um commit temporário primeiro:
Use todas as ferramentas adequadas para mesclar as alterações confirmadas anteriormente de volta aos arquivos locais e remova o commit fictício:
fonte
Minha operação pop bloqueada de forma semelhante ocorreu porque restos de arquivos ignorados (consulte o arquivo .gitignore). O status do Git me mostrou rastreado e não rastreado, mas minhas atividades não limparam os arquivos ignorados.
Detalhes: Eu usei
git stash save -a
, verifiquei o master para compilar e ver o comportamento original, depois tentei colocar tudo de volta para continuar editando. Quando eu verifiquei meu branch e tentei abrir, meus arquivos ignorados ainda estavam lá antes de salvar o stash. Isso ocorre porque o check-out do mestre afetou apenas os arquivos confirmados - não apagou os arquivos ignorados. Então o pop falhou, essencialmente dizendo que não queria restaurar meus arquivos ignorados armazenados em cima dos arquivos que ainda estavam lá. É uma pena que não consegui descobrir uma maneira de iniciar uma sessão de mesclagem com eles.No final das contas, eu costumava
git clean -f -d -x
remover os arquivos ignorados. Curiosamente, dos meus ~ 30, 4 arquivos ainda permaneceram após a limpeza (enterrados em subdiretórios). Terei que descobrir em que categoria eles estão, que eles tiveram que ser excluídos manualmente.Então meu pai teve sucesso.
fonte
Experimente isto:
git checkout stash -.
fonte
Outra solução:
fonte
Com Git 2.14.x / 2.15 (Q3 2017), a solução qwertzguy de 2014 não será mais necessária.
Antes do terceiro trimestre de 2017, você tinha que excluir o arquivo em questão e, em seguida, tentar armazenar / aplicar novamente.
Com o próximo lançamento do Git, você não terá que fazer isso.
Veja o commit bbffd87 (11 de agosto de 2017) de Nicolas Morey-Chaisemartin (
nmorey
) .(Incorporado por Junio C Hamano -
gitster
- no commit 0ca2f32 , 23 de agosto de 2017)fonte
A maneira mais segura de seguir o stashing
git stash -u
Isso irá esconder tudo, incluindo mudanças não planejadas
git stash drop
depois de terminar de trabalhar nele, para remover seu stash "seguro".
fonte