Desfazer pop stash do git que resulta em conflito de mesclagem

519

Comecei a fazer alterações na minha base de código, sem perceber que estava em um tópico antigo. Para transferi-los, eu queria escondê-los e aplicá-los a um novo ramo fora do mestre. Eu costumava git stash poptransferir alterações de trabalho em andamento para essa nova ramificação, esquecendo que não havia introduzido novas alterações no mestre antes de criar a nova ramificação. Isso resultou em vários conflitos de mesclagem e perda de um estoque limpo de minhas alterações (desde que eu usei o pop).

Depois de recriar o novo ramo corretamente, como posso recuperar minhas alterações ocultas para aplicá-las corretamente?

acjay
fonte

Respostas:

657

Como se vê, o Git é inteligente o suficiente para não deixar cair um stash se não se aplicar de maneira limpa. Consegui chegar ao estado desejado com as seguintes etapas:

  1. Para desfazer os conflitos de mesclagem: git reset HEAD .(observe o ponto à direita)
  2. Para salvar a mesclagem em conflito (apenas no caso): git stash
  3. Para retornar ao mestre: git checkout master
  4. Para obter as alterações mais recentes: git fetch upstream; git merge upstream/master
  5. Para corrigir minha nova ramificação: git checkout new-branch; git rebase master
  6. Para aplicar as alterações armazenadas corretas (agora a segunda na pilha): git stash apply stash@{1}
acjay
fonte
14
Excelente obrigado! # 6 é realmente a resposta que eu estava procurando. Poderia adicionar um git stash dropcomo o último passo para se livrar do estoque indesejado do nº 2.
austinmarton
2
O número 2 não funcionará se houver caminhos não mesclados; ele emitirá o erro descrito aqui: stackoverflow.com/questions/5483213/…
Étienne
5
Não é totalmente verdade - o Git manterá o stash na lista de stash se ele não for aplicado corretamente. Consulte estes documentos sobre git stash pop: "A aplicação do estado pode falhar com conflitos; nesse caso, não é removida da lista stash. Você precisa resolver os conflitos manualmente e ligar git stash dropmanualmente posteriormente". ( git-scm.com/docs/git-stash )
Carolyn Conway
4
Estranho como esta resposta ea questão são publicadas no exato mesmo minuto
call-me
14
@ Ligue para mim Isso é algo que eu acho que as pessoas deveriam fazer com mais frequência! Observe como o formulário "Faça uma pergunta" possui uma caixa de seleção que permite responder sua própria pergunta da mesma forma :). Às vezes, isso acontece comigo quando estou no processo de criar uma pergunta que está me atrapalhando, mas, ao tentar ajustar a pergunta para ser boa para o StackOverflow, acabo descobrindo a solução. Isso foi há um tempo atrás, então não me lembro se foi esse o caso aqui, mas acho que foi o que aconteceu.
acjay
341

Felizmente git stash pop, não muda o estoque no caso de um conflito!

Portanto, nada para se preocupar, limpe seu código e tente novamente.

Digamos que sua base de código estava limpa antes, você poderia voltar a esse estado com: git checkout -f
Então faça o que esqueceu, por exemplo: git merge missing-branch
Depois disso, basta disparar git stash popnovamente e você obterá o mesmo esconderijo que estava em conflito antes.

Atenção: O stash é seguro, no entanto, alterações não confirmadas no diretório de trabalho não são. Eles podem ficar confusos.

flori
fonte
16
O que eu entendo é que você pode simplesmente limpar e abrir novamente, mas não pode desfazê- lo. Se o pop se misturar com outras alterações não confirmadas, você deverá limpar manualmente.
haridsv
Esta é uma solução muito simples e funcionou muito bem para mim. Supõe-se que você pode reverter tudo o que mudou localmente (não houve alterações antes / depois que o stash foi estourado), o que acho que funciona na maioria das situações. Se você precisar salvar algumas alterações adicionais que ocorreram antes de perceber que isso era um problema, consiga confirmar esses arquivos antes de forçar um check-out na maioria dos casos.
precisa saber é o seguinte
Este não foi o meu caso. Eu o chamei de git stash poptentativa de mesclar automaticamente, entrar em conflito e mantê-lo.
Trevor Hickey
1
@TrevorHickey O ponto desta resposta é que o estoque permanece como no caso de um conflito, que você pode ligar git stash popquantas vezes precisar até terminar sem conflito. Portanto, após o conflito, sim, o diretório de trabalho está bagunçado, no entanto, você pode limpá-lo e ligar git stash popnovamente.
Flori
5
Este comando para desfazer a última aplicação de stash é muito útil git checkout -f:!
Lefi Tarik 19/02/19
16

As instruções aqui são um pouco complicadas, por isso vou oferecer algo mais direto:

  1. git reset HEAD --hard Abandonar todas as alterações na ramificação atual

  2. ... Executar trabalho intermediário, conforme necessário

  3. git stash pop Reponha o estoque novamente mais tarde, quando estiver pronto

anon58192932
fonte
vimeo.com/79954057
faintsignal
8
git checkout -f

deve funcionar, se o seu estado anterior estiver limpo.

Allahbakash.G
fonte