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?
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:
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".
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 in realtà non hai file non tracciati in quella scorta (ma pensavi di averlo fatto).
git stash show
non senza mostrare i file non monitorate (veri per almeno Git 2.7.4):
git stash pop
prima 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.
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:
git rev-list -g stash | git rev-list --stdin --max-parents=0 | xargs git show --stat
Ovviamente, rimuovi il --stat
per vedere il contenuto dei file.
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
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 stash
crea 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" .
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...fi
sezione cambia l'argomento bash $ 1 in 0 se non ne è stato passato nessuno.
Una soluzione alternativa: i file di gestione temporanea prima di riporli git stash show -p
funzioneranno 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.
git stash show
sembra mostrare la differenza tra la copia di lavoro e # 1 (codice pertinente da git-stash.sh:,git diff ${FLAGS:---stat} $b_commit $w_commit
in cui $ b_commit è # 1 e $ w_commit è il commit stash); esiste un modo integrato pergit stash show
includere anche il n. 3?