Respostas:
Na página de manual do git stash, você pode ler (na seção "Discussão", logo após a descrição de "Opções") que:
Um stash é representado como um commit cuja árvore registra o estado do diretório de trabalho e seu primeiro pai é o commit no HEAD quando o stash foi criado.
Portanto, você pode tratar o stash (por exemplo, o stash@{0}
primeiro / o mais alto stash) como um commit de mesclagem e usar:
$ git diff stash@{0}^1 stash@{0} -- <filename>
Explicação: stash@{0}^1
significa o primeiro pai do stash especificado, que, conforme declarado na explicação acima, é o commit no qual as alterações foram ocultadas. Usamos essa forma de "git diff" (com duas confirmações) porque stash@{0}
/ refs/stash
é uma confirmação de mesclagem e temos que dizer ao git qual pai ou mãe queremos diferenciar. Mais enigmático:
$ git diff stash@{0}^! -- <filename>
também deve funcionar (consulte a página de manual do git rev-parse para obter uma explicação da rev^!
sintaxe, na seção "Especificando intervalos").
Da mesma forma, você pode usar o git checkout para verificar um único arquivo fora do stash:
$ git checkout stash@{0} -- <filename>
ou para salvá-lo com outro nome de arquivo:
$ git show stash@{0}:<full filename> > <newfile>
ou
$ git show stash@{0}:./<relative filename> > <newfile>
( observe que aqui <nome completo do arquivo> é o nome completo do caminho de um arquivo em relação ao diretório superior de um projeto (pense em: relativo a stash@{0}
)).
Você pode precisar se proteger stash@{0}
da expansão do shell, ou seja, use "stash@{0}"
or 'stash@{0}'
.
git checkout
a página de manual. Ele não pode soltar o arquivo em outro local. Há uma referência a isso em: stackoverflow.com/questions/888414/...
git checkout
abordagem copia o arquivo exato do stash - não o mescla com o que está em seu diretório de trabalho como git stash apply
faria. (Portanto, se você tiver alguma alteração na base em que o stash foi criado, elas serão perdidas).
git stash apply
mesclar as alterações em um arquivo que foi modificado na árvore de trabalho desde que o arquivo foi armazenado em stash, esse arquivo na árvore de trabalho deve ser preparado. Para que a mesclagem automática funcione, os mesmos arquivos não podem ser modificados na cópia de trabalho e na cópia oculta para mesclar. Finalmente, aplicar stash não remove o item do stash como git stash pop
faria.
Se você usar, em git stash apply
vez de git stash pop
, ele aplicará o estoque à sua árvore de trabalho, mas ainda o manterá.
Com isso feito, você pode add
/ commit
o arquivo que deseja e, em seguida, redefinir as alterações restantes.
git stash pop stash@{0}
(lista as mudanças escondidas: git stash list
)
Existe uma maneira fácil de obter alterações de qualquer ramificação, incluindo stashes:
$ git checkout --patch stash@{0} path/to/file
Você pode omitir a especificação do arquivo se desejar corrigir várias partes. Ou omita o patch (mas não o caminho) para obter todas as alterações em um único arquivo. Substitua 0
pelo número do stash de git stash list
, se você tiver mais de um. Observe que é assim diff
e oferece a aplicação de todas as diferenças entre os ramos. Para obter alterações de apenas um único commit / stash, dê uma olhada git cherry-pick --no-commit
.
git help checkout
. --patch
faz mesclagem interativa. Aplica todos os pedaços que você aprova no shell (ou o que você salva se optar por e
editar o patch). Somente o caminho substituirá o arquivo, como escrevi, "todas as alterações".
git config --global alias.applydiffat '!git checkout --patch "$1" -- $(git diff --name-only "$1"^ "$1")'
- em seguida, git applydiffat stash@{4}
só usa arquivos que foram alterados entre o stash e seu pai.
Para ver o arquivo inteiro: git show stash@{0}:<filename>
Para ver o diff: git diff stash@{0}^1 stash@{0} -- <filename>
diff
por difftool
para usar seu diff externo favorito.
$ git checkout stash@{0} -- <filename>
Notas:
Certifique-se de colocar espaço após o parâmetro "-" e o nome do arquivo
Substitua zero (0) pelo seu número de stash específico. Para obter a lista stash, use:
git stash list
Baseado na resposta de Jakub Narębski - Versão mais curta
Você pode obter o diff para um stash com " git show stash@{0}
" (ou qualquer que seja o número do stash; consulte "git stash list"). É fácil extrair a seção do diff para um único arquivo.
git show stash
para mostrar o estoque mais alto (normalmente o único que você tem). Da mesma forma, você pode mostrar a diferença entre o seu ramo atual e o esconderijo com git diff head stash
.
O conceito mais simples de entender, embora talvez não seja o melhor, é que você alterou três arquivos e deseja ocultar um arquivo.
Se você fizer git stash
para guardar todos eles, git stash apply
traga-os de volta e depois git checkout f.c
no arquivo em questão para redefini-lo efetivamente.
Quando você deseja descompactar esse arquivo, execute um git reset --hard
e, em seguida, execute git stash apply
novamente, aproveitando o fato de que git stash apply
não limpa o diff da pilha stash.
Se os arquivos ocultos precisarem ser mesclados com a versão atual, use as formas anteriores usando diff. Caso contrário, você pode usá-lo git pop
para desempacotá-los, preparar git add fileWantToKeep
o arquivo e fazer um git stash save --keep-index
para guardar tudo, exceto o que está no palco. Lembre-se de que a diferença dessa maneira com as anteriores é que ela "exibe" o arquivo do stash. As respostas anteriores o mantêm, de git checkout stash@{0} -- <filename>
acordo com as suas necessidades.
Use o seguinte para aplicar as alterações em um arquivo em uma ocultação à sua árvore de trabalho.
git diff stash^! -- <filename> | git apply
Isso geralmente é melhor do que usar, git checkout
porque você não perderá nenhuma alteração feita no arquivo desde a criação do stash.
Use a extensão Git Stash no Visual Studio Code