Coloquei um esconderijo e houve um conflito de mesclagem. Diferente da pergunta que está listada como duplicada, eu já tinha algumas alterações não confirmadas no diretório que queria manter. Não quero apenas fazer desaparecer o conflito de mesclagem, mas também recuperar meu diretório para o estado que estava antes do pop.
Eu tentei git merge --abort
, mas o git alegou que nenhuma fusão estava em andamento. Existe uma maneira fácil de abortar um pop sem destruir as alterações que eu originalmente tive no diretório?
git stash pop
um diretório de trabalho imundo. Nesse caso, você pode simplesmentegit reset --hard
e seu estoque ainda está intacto. (Isso é mais ou menos o que @ topic ligada de BradKoch sugere)Respostas:
Ok, acho que elaborei o "git stash unapply". É mais complexo do que
git apply --reverse
porque você precisa de uma ação de mesclagem reversa, caso haja alguma mesclagem feita pelogit stash apply
.A mesclagem reversa requer que todas as alterações atuais sejam inseridas no índice:
git add -u
Inverta então o
merge-recursive
que foi feito porgit stash apply
:git merge-recursive stash@{0}: -- $(git write-tree) stash@{0}^1
Agora você terá apenas as alterações que não são de esconderijo. Eles estarão no índice. Você pode usar
git reset
para desestabilizar suas alterações, se quiser.Dado que o original
git stash apply
falhou, presumo que o inverso também pode falhar, pois algumas das coisas que ele deseja desfazer não foram feitas.Aqui está um exemplo mostrando como a cópia de trabalho (via
git status
) acaba limpa novamente:fonte
git stash apply
nunca cai um esconderijo, e quando uma mesclagem falhar, entãogit stash pop
também mantém o esconderijoMeu caso de uso: tentei entrar no ramo errado e ter conflitos. Tudo o que preciso é desfazer o pop, mas mantê-lo na lista de stash para que eu possa colocá-lo na ramificação correta. Eu fiz isso:
Fácil.
fonte
stash pop
entrar nele. Isso soa como uma receita para o desastre.Editar: A partir da
git help stash
documentação na seção pop:A aplicação do estado pode falhar com conflitos; nesse caso, não é removido da lista stash. Você precisa resolver os conflitos manualmente e chamar o git stash drop manualmente posteriormente.
Se a opção --index for usada, tente restabelecer não apenas as alterações da árvore de trabalho, mas também as do índice. No entanto, isso pode falhar quando você possui conflitos (que são armazenados no índice e, portanto, não é mais possível aplicar as alterações como eram originalmente).
Tente copiar todos os seus repositórios em um novo diretório (para ter uma cópia dele) e execute:
git stash show
e salve essa saída em algum lugar, se você se importa.then:
git stash drop
para soltar o estoque conflitante, então:git reset HEAD
Isso deve deixar seu repositório no estado em que estava antes (espero que ainda não tenha sido capaz de reprovar seu problema)
===
Estou tentando reprovar seu problema, mas tudo o que recebo quando usa
git stash pop
é:Em um dir limpo:
Não vejo o git tentando mesclar minhas alterações, apenas falha. Você tem alguma etapa de reprodução que possamos seguir para ajudá-lo?
fonte
Eu sempre usei
git reset --merge
Não me lembro de alguma vez ter falhado.
fonte
git reset
. Você sabe se é funcionalmente idêntico agit reset --merge
?Se você não precisar se preocupar com outras alterações feitas e quiser voltar ao último commit, poderá:
fonte
OK, acho que consegui encontrar um fluxo de trabalho que o levará de volta para onde você precisa estar (como se você não tivesse feito o pop).
FAÇA UM BACKUP ANTES !! Não sei se isso funcionará para você, então copie todo o seu repositório, caso não funcione.
1) Corrija os problemas de mesclagem e corrija todo o conflito, selecionando todas as alterações que vêm do patch (no caso de emergências, isso aparece como um.REMOETE (deles)).
2) Confirme essas alterações (elas já serão adicionadas pelo comando mergetool). Dê a ele uma mensagem de confirmação de "mesclagem" ou algo que você se lembre.
3) Agora você ainda terá as alterações locais sem estágio que você iniciou originalmente, com uma nova confirmação do patch (podemos nos livrar disso mais tarde). Agora confirme suas alterações sem etapas
4) Inverta o patch. Isso pode ser feito com o seguinte comando:
5) Confirme essas alterações:
6) Livre-se dos consertos de patch / unpatch
disso, remova as duas linhas com 'mesclar' e 'patch invertido'.
7) Recupere suas alterações sem alterações e desfaça o commit das 'alterações locais'
Eu o examinei com um exemplo simples e o leva de volta para onde você quer estar - imediatamente antes do stash ser exibido, com as alterações locais e com o stash ainda disponível para pop.
fonte
git stash show -p | git apply -R
isso não funciona se agit stash apply
fusão foi real. Veja minha resposta ...Eu resolvi isso de uma maneira um pouco diferente. Aqui está o que aconteceu.
Primeiro, entrei no ramo errado e tive conflitos. O estoque permaneceu intacto, mas o índice estava em resolução de conflitos, bloqueando muitos comandos.
Um simples
git reset HEAD
cancelou a resolução de conflitos e deixou os não comprometidos (e alterações INDESEJADAS ).Vários
git co <filename>
reverteram o índice para o estado inicial. Por fim, troquei o branchgit co <branch-name>
e executei um novogit stash pop
, que foi resolvido sem conflitos.fonte
Algumas ideias:
Use
git mergetool
para dividir os arquivos de mesclagem em peças originais e novas. Esperemos que um deles seja o arquivo com as alterações que não são de esconderijo.Aplique o diff do stash ao contrário, para desfazer apenas essas alterações. Você provavelmente terá que dividir manualmente os arquivos com os conflitos de mesclagem (que esperamos que o truque acima funcione).
Eu não testei nenhum deles, então não tenho certeza se eles funcionarão.
fonte
Eu poderia reproduzir limpo
git stash pop
no diretório "sujo", com alterações não confirmadas, mas ainda não pop que gera um conflito de mesclagem.Se em conflito de mesclagem o stash que você tentou aplicar não desapareceu, você pode tentar examinar
git show stash@{0}
(opcionalmente com--ours
ou--theirs
) e comparar comgit statis
egit diff HEAD
. Você deve poder ver quais alterações vieram da aplicação de uma ocultação.fonte
Se o DavidG estiver certo de que não colocou o stash por causa do conflito de mesclagem, basta limpar o diretório de trabalho. Rapidamente
git commit
tudo o que você gosta. (Você podereset
ousquash
confirmar mais tarde, se não tiver terminado.) Depois, com tudo o que você gosta com segurança,git reset
tudo o mais que foigit stash pop
despejado no diretório de trabalho.fonte
Se não houve alterações faseadas antes do
git stash pop
, como na pergunta, os dois comandos a seguir devem funcionar.O primeiro reverte qualquer mesclagem do stash, bem-sucedida ou não. O segundo exclui todos os arquivos não rastreados introduzidos pelo stash.
De
man git stash
:The working directory must match the index.
Que @DavidG aponta, ostash pop
erro falhará se houver conflito de arquivos modificados no momento. Como tal, não devemos nos preocupar em desanuviar conflitos de mesclagem, além do retorno a elesHEAD
. Todos os arquivos modificados restantes não são relacionados ao stash e foram modificados antes dostash pop
Se houve mudanças em etapas, não estou claro se podemos confiar nos mesmos comandos e você pode tentar a técnica de @Ben Jackson. Sugestões apreciadas ..
Aqui está uma configuração de teste para todos os vários casos https://gist.github.com/here/4f3af6dafdb4ca15e804
fonte
Use
git reflog
para listar todas as alterações feitas no seu histórico do git. Copie um ID de ação e digitegit reset ACTION_ID
fonte
Estou postando aqui esperando que outras pessoas achem minha resposta útil. Eu tive um problema semelhante ao tentar fazer um stash pop em um galho diferente do que eu havia escondido. No meu caso, eu não tinha arquivos não confirmados ou no índice, mas ainda assim entrei no caso de conflitos de mesclagem (o mesmo caso @pid). Como outros salientaram anteriormente, o pop com falha do git stash realmente reteve o meu stash, então um git rápido redefiniu HEAD mais voltando ao meu ramo original e fazendo o stash a partir daí resolveu o meu problema.
fonte