É possível visualizar o conteúdo oculto no git?


554

Costumo adiar o trabalho para depois, depois outras coisas aparecem e, algumas semanas depois, quero inspecionar o stash e descobrir quais mudanças ele faria se eu o aplicasse à árvore de trabalho em seu estado atual.

Eu sei que posso fazer uma diferença de git no stash, mas isso me mostra todas as diferenças entre a árvore de trabalho e o stash, enquanto eu só estou interessado em saber o que o stash aplicar vai mudar.

Como posso fazer isso?


1
saída diferencial colorida: git stash show -p stash@{1} >~/.diff && vim ~/.diff(não precisa ser vim. nenhum editor de texto, contanto que o seu editor de texto possua sintaxe, destacando o suporte à diffsaída).
Trevor Boyd Smith

Respostas:


729

git stash showmostrará os arquivos que foram alterados no seu esconderijo mais recente. Você pode adicionar a -popção para mostrar o diff.

git stash show -p

Se o stash no qual você estiver interessado não for o mais recente, adicione o nome do stash ao final do comando:

git stash show -p stash@{2}

Parece bom, e eu o vejo no manual, mas quando eu tento, isso me dá fatal: unable to create temp-file: Invalid argumentalguma idéia do porquê?
Benjol 27/08/10

29
Use git stash show -p stash@{0}para ver um estoque específico. 0 mostra o último tom, 1 o último último .. etc. git stash listmostrará todo o disponível.
18714

6
Se você estiver usando o PowerShell, precisará colocar o nome do stash entre aspas. (ou seja: git stash show -p 'stash@{0}')
Scott-pascoe


1
Se você quiser salvar o diff no uso de arquivos, git stash show -p stash@{0}> stash.txt
S_K

87

Para visualizar uma lista atual de stash:

git stash list

Você verá uma lista como esta:

stash@{0}: WIP on ...
stash@{1}: ...
stash@{2}: ...
...

Para visualizar o diff em qualquer um desses stashes:

git stash show -p stash@{n}

34

Sou fã da gitkinterface gráfica do usuário para visualizar repositórios git. Você pode ver o último item escondido:

gitk stash

Você também pode usar a visualização de qualquer uma das suas alterações ocultas (conforme listado por git stash list). Por exemplo:

gitk stash@{2}

Na captura de tela abaixo, você pode ver o stash como uma confirmação no canto superior esquerdo, quando e de onde veio no histórico de confirmação, a lista de arquivos modificados na parte inferior direita e a diferença linha a linha na parte inferior. -esquerda. O tempo todo ainda está escondido.

gitk vendo um esconderijo


5
Você pode fornecer vários stash@{X}valores na linha de comando para ver mais resultados de uma só vez, mas não encontrei uma maneira simples de dizer 'mostrar todas as entradas stash' no gitk.
Nobar

5
gitk stashparece ser uma abreviação de #gitk stash@{0}
Leif Gruenwoldt

3
para mostrar todos os stashes no gitk, você pode usar gitk `git stash list --pretty=format:%gd`e, em seguida, procure por "WIP ativado " para pular para o próximo stash.
Ikar Pohorský

2
gitk --reflogpermite ver todos os esconderijos e muito mais.
Nobar

1
O gitk foi a única ferramenta que me mostrou diretamente que o stash tinha arquivos não rastreados salvos nele. Todos os outros apenas me mostraram "sem diferenças".
Martin Bonner apoia Monica

22

Para visualizar todas as alterações em um stash não popped:

git stash show -p stash@{0}

Para visualizar as alterações de um arquivo específico em uma ocultação não removida:

git diff HEAD stash@{0} -- path/to/filename.php

no caso de não se lembrar dos nomes de arquivos também funciona para todos os arquivos alterados git stash de diff CABEÇA @ {0}
Simeon

Apenas para maior clareza: -pé a abreviação de --patch. A opção vem git-diff. Se você preferir o formulário longo, pode escrever git stash show --patch.
Peterino 28/05/19

5

Além da recomendação do gitk em É possível visualizar o conteúdo do stash no git? você pode instalar o tig e ligar tig stash. Este programa de console gratuito / aberto também permite escolher qual esconderijo comparar


1
Parece uma ferramenta perfeita para gerenciar vários esconderijos! Você também pode pop e cair esconderijos com Pe !chaves respectivamente.
Ikar Pohorský

As alternativas de TUI são sempre boas, mas para as pessoas que já acostumaram ou preferem de alguma forma gitk , é relativamente fácil hackear para mostrar todos os esconderijos .
1737973


4

Quando essa pergunta foi feita pela primeira vez, isso pode não ter sido uma opção, mas, se você usa o PyCharm, pode usar a UnStash Changesferramenta (VCS-> Git-> UnStash Changes ...). Isso permite que você exiba a lista de alterações ocultas, além de exibir, soltar, limpar ou aplicar (em uma nova ramificação, se desejar):

Janela Desinstalar alterações

e visualize os arquivos alterados por esconderijo:

Janela de caminhos afetados

assim como diffs por arquivo. Nos diffs, você pode escolher as alterações individuais para aplicar a partir das alterações ocultas no ramo de trabalho (usando a divisa esquerda):

insira a descrição da imagem aqui


3

Você pode visualizar a lista de todos os stashes pelo seguinte comando:

$ git stash list

stash@{0}: WIP on dev: ddd4d75 spelling fix

stash@{1}: WIP on dev: 40e65a8 setting width for messages

......

......

......


stash@{12}: WIP on dev: 264fdab added token based auth

O estoque mais novo é o primeiro.

Você pode simplesmente selecionar o índice nde esconderijo fornecido na lista acima e usar o comando a seguir para visualizar os detalhes escondidos

git stash show -p stash@{3}

Similarmente,

git stash show -p stash@{n}

Você também pode verificar o diff usando o comando:

git diff HEAD stash@{n} -- /path/to/file

3

Sim, a melhor maneira de ver o que é modificado é salvar em um arquivo assim:

git stash show -p stash@{0} > stash.txt

2

Primeiro, podemos fazer uso da lista git stash para obter todos os itens stash:

$git stash list
stash@{0}: WIP on ...
stash@{1}: WIP on ....
stash@{2}: WIP on ...

Em seguida, podemos usar git stash show stash@{N}para verificar os arquivos em um esconderijo específico N. Se dispararmos, podemos obter:

$ git stash show stash@{2}
fatal: ambiguous argument 'stash@2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

A razão para isso pode ser que a concha esteja consumindo aparelho nos dentes e o git vê stash@2e não stash@{2}. E para corrigir isso, precisamos usar aspas simples para chaves como:

git stash show stash@'{2'}
com/java/myproject/my-xml-impl.xml                     | 16 ++++++++--------
com/java/myproject/MyJavaClass.java                    | 16 ++++++++--------
etc.

2

Ver lista de alterações ocultas

git stash list

Para visualizar a lista de arquivos alterados em um stash específico

git stash show -p stash@{0} --name-only

Para visualizar um arquivo específico no stash

git show stash@{0} path/to/file

1

Mostrar todos os stashes

Apenas nomes de arquivo:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show $i; done

Conteúdo completo do arquivo em todos os stashes:

for i in $(git stash list --format="%gd") ; do echo "======$i======"; git stash show -p $i; done

Você obterá um resultado diferenciado colorido com o qual poderá paginar space ( para frente ) e b( para trás ), e qfechar o pager para o stash atual. Se você preferir tê-lo em um arquivo, acrescente > stashes.diffo comando.


1

Além das respostas existentes, que sugerem o uso (para mostrar a diferença entre o penúltimo e o último stash)

git stash show -p stash@{2}

Observe que na git-stashdocumentação está escrito que

Os stashes também podem ser referenciados especificando apenas o índice de stash (por exemplo, o número inteiro né equivalente a stash@{n}).

Portanto, também é possível usar (isso é equivalente ao comando acima)

git stash show -p 2

O que também deve evitar alguns problemas do Powershell .


1

Eu gosto de como gitkmostrar exatamente o que não foi rastreado ou que está no índice, mas, por padrão, ele mostrará os stash "commits" no meio de todos os outros commits no branch atual.

O truque é executar o gitk da seguinte maneira:

gitk "stash@{0}^!"

(A citação existe para fazê-lo funcionar no Powershell, mas dessa forma ainda deve funcionar em outros reservatórios.)

Se você procurar esta sintaxe na página de ajuda de gitrevisions, encontrará o seguinte:

A r1^!notação inclui commit r1, mas exclui todos os seus pais. Por si só, essa notação denota o único commit r1 .

Aparentemente, isso colocará o gitk de tal maneira que apenas os pais imediatos do commit selecionado sejam mostrados, e é exatamente isso que eu gosto.


Se você quiser levar isso adiante e listar todos os stashes, execute:

gitk `git stash list '--pretty=format:%gd^!'`

(Essas aspas simples dentro dos backticks são necessárias para apaziguar Bash, caso contrário, ela reclama do ponto de exclamação)

Se você estiver no Windows e estiver usando o cmd ou o Powershell:

gitk "--argscmd=git stash list --pretty=format:%gd^!"

0

O comando a seguir pode ser usado para extrair o diff da alteração oculta novamente em qualquer outra ocultação ou confirmação ou ramificação ou HEAD.

git stash show
git show
git diff
git difftool

Vamos ver como podemos usar cada um dos comandos mencionados acima.

  1. show de esconderijo git

O comando simples git stash show fornece um resumo muito breve das alterações do arquivo, mas não mostra o diff das alterações no HEAD atual.

  1. show git

O comando git-show é usado para ver vários tipos de objetos.

O comando git-show não é usado apenas para visualizar alterações no esconderijo, mas também para ver um ou mais objetos como blobs, árvores, tags e confirmações.

  1. git diff

O comando git-diff também é um comando comum que é usado para mostrar alterações entre confirmações, confirmação e árvore de trabalho, etc.

Por padrão, o git diff mostrará o diff do stash selecionado contra o estado atual do repositório (arquivos modificados), a menos que outra referência ou confirmação stash seja especificada.

Para obter a diferença entre o stash mais stash @ {0} e a ramificação principal:

$ git diff stash @ {0} mestre

Exiba apenas os nomes dos arquivos e não as alterações:

$ git diff - stash somente com nome @ {0} master

Veja o diff entre stashes selecionados para um arquivo selecionado:

$ git diff stash @ {0} ^ 1 stash @ {0} -

  1. git difftool

O comando git-difftool também pode ser usado para encontrar diferenças entre o stash selecionado e o commit ou branch ou stash selecionado

Veja a diferença entre os dois stashes mais recentes:

$ git difftool stash @ {0} stash @ {0} ^ 1

git difftool --dir-diff stash @ {0} stash @ {0} ^ 1

Resumo:

Comandos úteis para extrair o diff do stash selecionado stash show, git show, git diff, git difftool.

Veja a diferença usando o comando git stash show,

git stash show -p stash @ {0}

Veja as mudanças no stash usando o comando git show,

git show stash @ {1}

Veja a diferença entre o stash mais recente e a confirmação selecionada usando o comando git diff,

git diff stash @ {0}

Referências:

https://howto.lintel.in/how-to-see-stashed-changes-using-git-stash/

https://git-scm.com/docs/git-show

https://git-scm.com/docs/git-stash

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.