Gostaria de saber se é possível extrair um único arquivo ou diff de um arquivo de um stash git sem desativar o conjunto de alterações stash.
Alguém pode fornecer algumas sugestões / idéias sobre isso?
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 comogit 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 comogit stash pop
faria.Se você usar, em
git stash apply
vez degit 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.fonte
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:
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 degit stash list
, se você tiver mais de um. Observe que é assimdiff
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 olhadagit cherry-pick --no-commit
.fonte
git help checkout
.--patch
faz mesclagem interativa. Aplica todos os pedaços que você aprova no shell (ou o que você salva se optar pore
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.Resposta curta
Para ver o arquivo inteiro:
git show stash@{0}:<filename>
Para ver o diff:
git diff stash@{0}^1 stash@{0} -- <filename>
fonte
diff
pordifftool
para usar seu diff externo favorito.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:
Baseado na resposta de Jakub Narębski - Versão mais curta
fonte
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.fonte
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 comgit 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 depoisgit 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, executegit stash apply
novamente, aproveitando o fato de quegit stash apply
não limpa o diff da pilha stash.fonte
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, preparargit add fileWantToKeep
o arquivo e fazer umgit 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, degit checkout stash@{0} -- <filename>
acordo com as suas necessidades.fonte
Use o seguinte para aplicar as alterações em um arquivo em uma ocultação à sua árvore de trabalho.
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.fonte
Use a extensão Git Stash no Visual Studio Code
fonte