Tenho um pequeno patch guardado no meu esconderijo git. Eu apliquei na minha cópia de trabalho usando git stash apply
. Agora, eu gostaria de fazer o backup dessas alterações aplicando o patch inversamente (como o que git revert
faria, mas contra o esconderijo).
Alguém sabe como fazer isso?
Esclarecimento: Há outras alterações na minha cópia de trabalho. Meu caso particular é difícil de descrever, mas você pode imaginar algum código experimental ou de depuração que esteja no esconderijo. Agora está misturado em minha cópia de trabalho com outras alterações e eu gostaria de ver o efeito com e sem as alterações do estoque.
Atualmente, não parece que o stash suporte isso, mas um git stash apply --reverse
seria um recurso interessante.
Respostas:
De acordo com a página de manual do git-stash , "Um stash é representado como um commit cuja árvore registra o estado do diretório de trabalho e seu primeiro pai é o commit no
HEAD
momento em que o stash foi criado" egit stash show -p
fornece "as alterações registradas no stash como uma diferença entre o estado stashed e seu pai original.Para manter intactas as outras alterações, use
git stash show -p | patch --reverse
o seguinte:Editar:
Uma leve melhoria para isso é usar
git apply
no lugar do patch:Como alternativa, você também pode usar
git apply -R
como abreviação degit apply --reverse
.Ultimamente tenho achado isso realmente útil ...
fonte
git apply -R
é uma melhoria, pelo menos para mim na minha caixa de janelas com o git bash, poispatch --reverse
tive problemas para localizar o arquivo a ser corrigido (nenhuma pista real de por que a alternativa funcionou). +1 e boa explicação--index
assimgit stash show -p | git apply --reverse --index
. Como você não precisa mais adicionar no índice as alterações que são revertidas.git stash show -p | git apply -R -v
com a mensagem:Checking patch messages... error: while searching for: Hello, world Hello again error: patch failed: messages:1
. Você sabe o que pode estar errado?git stash
[save]
pega seu estado de diretório de trabalho e seu estado de índice e os esconde, definindo o índice e a área de trabalho para aHEAD
versão.git stash apply
recupera essas alterações, portanto asgit reset --hard
remove novamente.git stash pop
recupera essas alterações e remove as alterações armazenadas no topo,git stash [save]
retornando ao estado anterior (pré-pop) nesse caso.fonte
removerá quaisquer alterações sem confirmação.
fonte
A página de manual do git V1 tinha uma referência sobre a não aplicação de um stash. O trecho está abaixo.
A página do manual git V2 mais recente não inclui nenhuma referência à desinstalação de um stash, mas o abaixo ainda funciona bem
Removendo a Aplicação de uma Stash Em alguns cenários de casos de uso, você pode aplicar alterações ocultas, faça algum trabalho, mas depois aplique as alterações que originalmente vieram do stash. O Git não fornece um comando de remoção de aplicação do stash, mas é possível obter o efeito simplesmente recuperando o patch associado a um stash e aplicando-o ao contrário:
Novamente, se você não especificar um stash, o Git assumirá o stash mais recente:
Você pode criar um alias e efetivamente adicionar um comando stash-unapply ao seu Git. Por exemplo:
fonte
Isso está muito atrasado, mas se eu interpretar o problema corretamente, encontrei uma solução simples, observe, esta é uma explicação em minha própria terminologia:
git stash [save]
salvará as alterações atuais e definirá sua ramificação atual como "estado limpo"git stash list
dá algo como:stash@{0}: On develop: saved testing-stuff
git apply stash@{0}
definirá o ramo atual como antesstash [save]
git checkout .
Definirá o ramo atual como depoisstash [save]
O código salvo no stash não é perdido, pode ser encontrado
git apply stash@{0}
novamente.De qualquer forma, isso funcionou para mim!
fonte
git stash apply --reverse
primeira e depois simplesmente voltei agit stash apply stash@{x}
gostar de você mencionar. Trabalhou sem problemas.Além do que os outros mencionaram, a maneira mais fácil é fazer primeiro
e depois efetue o check-out de todas as alterações locais
fonte
Além da resposta do @Greg Bacon, no caso de arquivos binários serem adicionados ao índice e fazer parte do stash usando
pode resultar em
A adição
--binary
resolve o problema, mas infelizmente ainda não descobrimos o porquê.fonte
Você pode seguir a imagem que eu compartilhei para descompactar se você tocar acidentalmente em stashing.
fonte
Isso é um acréscimo às respostas acima, mas adiciona uma pesquisa ao stash git com base na mensagem, pois o número do stash pode mudar quando novos stash são salvos. Eu escrevi algumas funções do bash:
$ git stash save "my stash"
$ apply "my stash"
$ remove "my stash"
fonte