Eu escondi minhas alterações. Agora, quero remover apenas alguns arquivos do stash. Como posso fazer isso?
Eu escondi minhas alterações. Agora, quero remover apenas alguns arquivos do stash. Como posso fazer isso?
Respostas:
Conforme mencionado abaixo e detalhado em " Como eu extrairia um único arquivo (ou alterações em um arquivo) de um stash git? ", Você pode aplicar o uso git checkout
ou git show
restaurar um arquivo específico.
git checkout stash@{0} -- <filename>
Isso sobrescreve filename
: verifique se você não teve modificações locais, ou você pode mesclar o arquivo oculto .
(Como comentado por Jaime M. , com certeza shell como tcsh onde você precisa escapar os caracteres especiais, a sintaxe seria: git checkout 'stash@{0}' -- <filename>
)
ou para salvá-lo com outro nome de arquivo:
git show stash@{0}:<full filename> > <newfile>
(observe que aqui
<full filename>
está o nome do caminho completo de um arquivo em relação ao diretório superior de um projeto (pense em: relativo astash@{0}
)).
yucer sugere nos comentários :
Se você deseja selecionar manualmente quais alterações deseja aplicar nesse arquivo:
git difftool stash@{0}..HEAD -- <filename>
Vivek acrescenta nos comentários :
Parece que "
git checkout stash@{0} -- <filename>
" restaura a versão do arquivo no momento em que a ocultação foi realizada - NÃO aplica (apenas) as alterações ocultas para esse arquivo.
Para fazer o último:
git diff stash@{0}^1 stash@{0} -- <filename> | git apply
(como comentado por peterflynn , | git apply -p1
em alguns casos, talvez seja necessário remover uma ( p1
) barra principal dos caminhos de diferenças tradicionais)
Como comentado: "unstash" ( git stash pop
), então:
git add
)git stash --keep-index
O último ponto é o que permite manter um arquivo enquanto oculta outros.
Está ilustrado em " Como esconder apenas um arquivo de vários arquivos que foram alterados ".
git stash pop
devido a conflitos de arquivo. A resposta de Balamurugan A fez o truque para mim nesse caso.
unstash
signifique pop
, como me parece que provavelmente aconteceria na maioria dos casos, isso apenas responde parcialmente à pergunta. Como você remove as peças aplicadas seletivamente do esconderijo para evitar conflitos e / ou confusão posteriores ao fazer as alterações restantes?
git checkout stash@{N} <File(s)/Folder(s) path>
Por exemplo. Para restaurar apenas o arquivo ./test.c e a pasta ./include da última armazenada,
git checkout stash@{0} ./test.c ./include
-a
bandeira ao criar o esconderijo.
Acho que a resposta do VonC é provavelmente o que você deseja, mas aqui está uma maneira de fazer um "git apply" seletivo:
git show stash@{0}:MyFile.txt > MyFile.txt
checkout
nada.
git show stash@`{0`}:Path/To/MyFile.txt |sc Path/To/MyFile.txt
- os backticks são necessários para o PS não interpretar os aparelhos especialmente, e isso sc
é necessário porque o >
operador do PS usa como padrão UTF-16 (na verdade UCS-2), o que provavelmente não é o que você deseja. A resposta de @Balamurugan A não sofre com esses problemas.
Primeira lista de todos os esconderijos
git stash list
↓
stash@{0}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{1}: WIP on Produktkonfigurator: 132c06a5 Cursor bei glyphicon plus und close zu zeigende Hand ändern
stash@{2}: WIP on master: 7e450c81 Merge branch 'Offlineseite'
Em seguida, mostre quais arquivos estão no stash (vamos escolher o stash 1):
git stash show 1 --name-only
//Hint: you can also write
//git stash show stash@{1} --name-only
↓
ajax/product.php
ajax/productPrice.php
errors/Company/js/offlineMain.phtml
errors/Company/mage.php
errors/Company/page.phtml
js/konfigurator/konfigurator.js
Aplique o arquivo que você deseja:
git checkout stash@{1} -- <filename>
ou pasta inteira:
git checkout stash@{1} /errors
Também funciona sem, --
mas é recomendável usá-los. Veja este post.
Também é convencional reconhecer um hífen duplo como um sinal para interromper a interpretação das opções e tratar todos os argumentos a seguir literalmente.
git stash pop
gerou um erro para arquivos não rastreados. obrigado.
Se você git stash pop
(sem conflitos) removerá o esconderijo depois de aplicado. Mas se você git stash apply
aplicar o patch sem removê-lo da lista de stash. Em seguida, você pode reverter as alterações indesejadas comgit checkout -- files...
git stash pop
e houver conflitos, precisará corrigi-los manualmente e o stash NÃO será removido.
Mais uma maneira:
git diff stash@{N}^! -- path/to/file1 path/to/file2 | git apply -R
checkout
ou show
substituirá cegamente seu arquivo em vez de apenas aplicar alterações. "Mais uma maneira" é um eufemismo.
path/to/file2
que você deseja diferenciar no mesmo arquivo no seu espaço de trabalho. Deixar o segundo caminho funciona bem para mim. - E recebo uma mensagem de erro usando a -R
opção ("aplicar o patch ao contrário", tentando corrigir a versão escondida ?!). Então, minha versão de trabalho se parece git diff stash@{N}^! -- path/to/file | git apply -
.
...| git apply -3 -
Para usuários do Windows: chaves entre dentes têm um significado especial no PowerShell. Você pode cercar com aspas simples ou escapar com backtick. Por exemplo:
git checkout 'stash@{0}' YourFile
Sem ele, você pode receber um erro:
Unknown switch 'e'