Se eu correr git stash -u
, posso esconder arquivos não rastreados. No entanto, esses arquivos não rastreados não aparecem com git stash show stash@{0}
. Existe alguma maneira de mostrar arquivos ocultos não rastreados sem aplicar o estoque?
Se eu correr git stash -u
, posso esconder arquivos não rastreados. No entanto, esses arquivos não rastreados não aparecem com git stash show stash@{0}
. Existe alguma maneira de mostrar arquivos ocultos não rastreados sem aplicar o estoque?
Respostas:
Arquivos não rastreados são armazenados no terceiro pai de um commit stash. (Isso não está realmente documentado, mas é bastante óbvio pelo commit que introduziu o recurso -u, 787513 ... , e a forma como o resto da documentação paragit-stash
coisas de frases ... ou apenas fazendo git log --graph stash@{0}
)
Você pode ver apenas a parte "não rastreada" do estoque via:
git show stash@{0}^3
ou, apenas a própria árvore "não rastreada", via:
git show stash@{0}^3:
ou um determinado arquivo "não rastreado" na árvore, por meio de:
git show stash@{0}^3:<path/to/file>
Infelizmente, não existe uma boa maneira de obter um resumo das diferenças entre todos os estados encenado + não-encenado + não-controlado vs "atual". ie: git show stash@{0}
não pode ser feito para incluir os arquivos não rastreados. Isso ocorre porque o objeto de árvore do próprio commit stash, referido como stash@{0}:
, não inclui nenhuma mudança do terceiro pai "não testado".
Isso se deve ao modo como os stashes são reaplicados: arquivos rastreados podem ser facilmente aplicados como patches, enquanto arquivos não rastreados podem ser aplicados, em teoria, como "arquivos inteiros".
git log --graph --topo-order -m -u
. matthewlmcclure.com/s/2014/01/10/…
fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.
) se na verdade não tiver arquivos não rastreados naquele esconderijo (mas pensei que sim).
git stash show
não não mostrar os arquivos untracked (true por pelo menos git 2.7.4):
git stash pop
tentará primeiro restaurar arquivos não rastreados e, em seguida, tentará restaurar arquivos rastreados. Se a última operação falhar (por exemplo, conflito), a primeira operação não será revertida (arquivo não rastreado permanecerá como está, mas os arquivos não serão removidos do disco), então, mesmo se você corrigir o conflito, o próximo pop falhará de qualquer forma.
Você pode listar todos os commits de stash com o seguinte comando:
git rev-list -g stash
Como os stashes são representados como um commit de mesclagem de 3 vias de HEAD, o índice e um commit "raiz" sem pai de arquivos não rastreados, os stashes de arquivos não rastreados podem ser listados canalizando a saída acima para o seguinte:
git rev-list -g stash | git rev-list --stdin --max-parents=0
Aplicações úteis dos itens acima:
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat
Claro, remova o --stat
para ver o conteúdo dos arquivos.
git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>
git rev-list -g stash | git rev-list --stdin | xargs git show --stat
Para listar os arquivos não rastreados no stash:
git ls-tree -r stash@{0}^3 --name-only
Para mostrar uma comparação completa de todos os arquivos não rastreados (com conteúdo):
git show stash@{0}^3
Esses comandos lêem o último (mais recente) stash. Para stashes anteriores, aumente o número atrás do "stash @", por exemplo, stash@{2}
para o segundo do último stash.
O motivo pelo qual isso funciona é que git stash
cria um commit de mesclagem para cada stash, que pode ser referenciado como stash@{0}
, stash@{1}
etc. O primeiro pai desse commit é o HEAD no momento do stash, o segundo pai contém as mudanças nos arquivos rastreados, e o terceiro (que pode não existir) as alterações em arquivos não rastreados.
Isso é parcialmente explicado na página de manual em "Discussão" .
Para ver todos os arquivos no stash (rastreados e não rastreados), adicionei este alias à minha configuração:
showstash = "!if test -z $1; then set -- 0; fi; git show --stat stash@{$1} && git show --stat stash@{$1}^3 2>/dev/null || echo No untracked files -"
Leva um único argumento de qual stash você deseja visualizar. Observe que ele ainda o apresentará em duas listas consecutivas.
A if...fi
seção muda o argumento bash $ 1 para 0 se nenhum foi passado.
Uma solução alternativa: preparar os arquivos antes de armazená-los git stash show -p
funcionará conforme o esperado.
git add .
git stash save
Nota: Esta forma dá o poder de adicionar partes interativas também, aqui está como .
Cuidado: certifique-se de não ter um trabalho encenado anteriormente, ou você não será capaz de distingui-lo.
Isso pode ser útil.
git stash show
parece mostrar a diferença entre a cópia de trabalho e # 1 (código relevante de git-stash.sh:,git diff ${FLAGS:---stat} $b_commit $w_commit
no qual $ b_commit é # 1 e $ w_commit é o commit stash); existe alguma maneira embutida degit stash show
incluir também o nº 3?