In git, c'è un modo per mostrare i file nascosti non tracciati senza applicare lo stash?


100

Se corro git stash -u, posso archiviare file non tracciati. Tuttavia, detti file non tracciati non vengono visualizzati affatto con git stash show stash@{0}. C'è un modo per mostrare i file nascosti non tracciati senza applicare lo stash?

Risposte:


121

I file non tracciati vengono archiviati nel terzo genitore di un commit stash. (Questo non è effettivamente documentato, ma è abbastanza ovvio da The commit che ha introdotto la funzione -u, 787513 ... , e il modo in cui il resto della documentazione per legit-stash frasi ... o semplicemente facendo git log --graph stash@{0})

Puoi visualizzare solo la parte "non tracciata" della scorta tramite:

git show stash@{0}^3

o, solo l'albero "non tracciato" stesso, tramite:

git show stash@{0}^3:

oppure, un particolare file "non tracciato" nell'albero, tramite:

git show stash@{0}^3:<path/to/file>

Sfortunatamente, non esiste un buon modo per ottenere un riepilogo delle differenze tra tutto lo stato in scena + non in scena + non tracciato rispetto allo stato "corrente". cioè: git show stash@{0}non può essere fatto per includere i file non tracciati. Questo perché l'oggetto albero del commit stash stesso, indicato come stash@{0}:, non include alcuna modifica dal terzo genitore "unstaged".

Ciò è dovuto al modo in cui gli stash vengono riapplicati: i file tracciati possono essere facilmente applicati come patch, mentre i file non tracciati possono essere applicati, in teoria, solo come "file interi".


Quindi i genitori del commit stash sono (1. Lo stash commit viene creato contro 2. Indice 3. Copia di lavoro non tracciata) e lo stash commit stesso contiene la copia di lavoro tracciata? git stash showsembra mostrare la differenza tra la copia di lavoro e # 1 (codice pertinente da git-stash.sh:, git diff ${FLAGS:---stat} $b_commit $w_commitin cui $ b_commit è # 1 e $ w_commit è il commit stash); esiste un modo integrato per git stash showincludere anche il n. 3?
Max Nanasy

Come dici tu, non ho trovato un modo per ottenere una visione unica sintesi di una scorta, ma si può vedere le sue informazioni complete in un unico comando con: git log --graph --topo-order -m -u. matthewlmcclure.com/s/2014/01/10/…
Matt McClure

4
Nota che ottieni un brutto errore ( fatal: ambiguous argument 'stash@{0}^3': unknown revision or path not in the working tree.) se in realtà non hai file non tracciati in quella scorta (ma pensavi di averlo fatto).
Randall

2
@antak: no, git stash shownon senza mostrare i file non monitorate (veri per almeno Git 2.7.4):
Norbert berci

1
Nota (2.13.2-linux): git stash popprima tenterà di ripristinare i file non tracciati, quindi tenterà di ripristinare i file tracciati. Se l'ultima operazione fallisce (es. Conflitto), la prima operazione non viene annullata (untracked-file-stash rimarrà com'è ma i file non vengono rimossi dal disco), quindi anche se risolvi il conflitto, il pop successivo fallirà Comunque.
Marinos An

22

Puoi elencare tutti i commit di stash con il seguente comando:

git rev-list -g stash

Poiché gli stash sono rappresentati come un commit di unione a 3 vie di HEAD, l'indice e un commit "root" senza genitore di file non tracciati, gli stash di file non tracciati possono essere elencati reindirizzando l'output di cui sopra nel seguente:

git rev-list -g stash | git rev-list --stdin --max-parents=0

Applicazioni utili di quanto sopra:

Mostra solo file non tracciati e nascosti

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat

Ovviamente, rimuovi il --statper vedere il contenuto dei file.

Trova un file specifico

git rev-list -g stash | xargs -n1 git ls-tree -r | sort -u | grep <pattern>

File grep non tracciati

git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git grep <pattern>

Elenca tutti i contenuti di tutti gli stash

git rev-list -g stash | git rev-list --stdin | xargs git show --stat

10

Per elencare i file non tracciati nello stash:

git ls-tree -r stash@{0}^3 --name-only

Per mostrare una differenza completa di tutti i file non tracciati (con contenuto):

git show stash@{0}^3

Questi comandi leggono l'ultimo (più recente) stash. Per gli stash precedenti, incrementa il numero dietro "stash @", ad esempio stash@{2}per il secondo dall'ultimo stash.

Il motivo per cui funziona è che git stashcrea un merge commit per ogni stash, a cui si può fare riferimento come stash@{0}, stash@{1}ecc. Il primo genitore di questo commit è l'HEAD al momento dello stash, il secondo genitore contiene le modifiche ai file tracciati e il terzo (che potrebbe non esistere) le modifiche ai file non tracciati.

Questo è in parte spiegato nella manpage sotto "Discussione" .


5

Per vedere tutti i file nella scorta (sia tracciati che non tracciati), ho aggiunto questo alias alla mia configurazione:

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 -"

Richiede un singolo argomento di quale scorta si desidera visualizzare. Nota che lo presenterà ancora in due elenchi back-to-back.

La if...fisezione cambia l'argomento bash $ 1 in 0 se non ne è stato passato nessuno.


5

Una soluzione alternativa: i file di gestione temporanea prima di riporli git stash show -pfunzioneranno come previsto.

git add .
git stash save

Nota: in questo modo è possibile aggiungere anche porzioni interattive, ecco come .
Attenzione: assicurati di non aver precedentemente messo in scena un lavoro, altrimenti non sarai in grado di distinguerlo.
Questo può essere utile.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.