Git stash uncached: come archiviare tutte le modifiche non organizzate?


96

Supponiamo che due set di modifiche vengano apportate in un progetto con versione di git. Un set è messo in scena e l'altro no.

Vorrei ricontrollare le modifiche in fasi eseguendo il mio progetto in questo stato (prima del commit). Qual è un modo semplice per mettere da parte tutte le modifiche non messe in scena e lasciarle solo in scena? Quindi ho bisogno che le modifiche non programmate scompaiano dal mio progetto, ma siano archiviate da qualche parte per ulteriori lavori.

Questo suona molto come un git stashcomando. Ma git stashmetterei i cambiamenti non in scena e in scena lontano dal mio progetto. E non riesco a trovare qualcosa di simile git stash uncached.


Ad oggi con il mio git 2.21, non c'è ancora una buona risposta a questo. Tutte le risposte seguenti sono errate ( -kopzione) o scomode da usare.
Penghe Geng,

Risposte:


98

Aggiornamento 2:
non sono sicuro del motivo per cui le persone si lamentano di questa risposta, sembra che funzioni perfettamente con me, per i file non trattati puoi aggiungere il -uflag

Il comando completo diventa git stash --keep-index -u

Ed ecco un frammento dal git-stashaiuto

Se viene utilizzata l'opzione --keep-index, tutte le modifiche già aggiunte all'indice vengono lasciate intatte.

Se viene utilizzata l'opzione --include-untracked, anche tutti i file non tracciati vengono nascosti e quindi ripuliti con git clean, lasciando la directory di lavoro in uno stato molto pulito. Se invece viene utilizzata l'opzione --all, i file ignorati vengono nascosti e puliti in aggiunta ai file non tracciati.

E questa è una gif di come appare:

inserisci qui la descrizione dell'immagine

Aggiornare:

Anche se questa è la risposta selezionata, molti hanno sottolineato che la [risposta sotto] (https://stackoverflow.com/a/34681302/292408) è quella corretta, ti consiglio di verificarla.

Ho testato di nuovo la mia risposta oggi (31/1/2020) con la versione git 2.24.0, e continuo a credere che sia corretta, ho aggiunto una piccola nota sopra sui file non tracciati. Se pensi che non funzioni, menziona anche la tua versione di git.

Vecchia risposta :
se --keep-indexsi utilizza l' opzione, tutte le modifiche già aggiunte all'indice vengono lasciate intatte:

git stash --keep-index

Dalla documentazione digit-stash :

Testare i commit parziali

È possibile utilizzare git stash save --keep-indexquando si desidera eseguire due o più commit dalle modifiche nell'albero di lavoro e si desidera testare ogni modifica prima di eseguire il commit:

# ... hack hack hack ...
$ git add --patch foo            # add just first part to the index
$ git stash save --keep-index    # save all other changes to the stash
$ edit/build/test first part
$ git commit -m 'First part'     # commit fully tested change
$ git stash pop                  # prepare to work on all other changes
# ... repeat above five steps until one commit remains ...
$ edit/build/test remaining parts
$ git commit foo -m 'Remaining parts'

Ma, se vuoi solo controllare visivamente solo le modifiche graduali, puoi provare difftool:

git difftool --cached

4
vedi anche git stash [-p|--patch]che sembra un nascondiglio interattivo. Da man git stash"Con --patch, puoi selezionare in modo interattivo gli hunk dalla differenza tra HEAD e l'albero di lavoro da nascondere."
qui

1
Di solito add -p, checkout -pe reset -p, mai provato stash -p, grazie per il suggerimento: D
Mohammad AbuShady

18
Nota che questa risposta nasconderà anche le modifiche che hai messo in scena.
Ben Flynn

Questa risposta non è molto utile in quanto provocherà confusione. Questa risposta è migliore stackoverflow.com/a/34681302/292408 .
Elijah Lynn

1
@ElijahLynn Ho collegato l'altra risposta poiché ho trovato molte persone che dicono che è la risposta migliore, grazie per il tuo commento
Mohammad AbuShady,

100

La risposta accettata nasconde anche cambiamenti in scena, come alcuni hanno sottolineato. Ecco un modo per farlo senza ottenere le modifiche organizzate nella scorta.

L'idea è di eseguire un commit temporaneo delle modifiche in fasi, quindi nascondere le modifiche non in fase, quindi annullare il commit del commit temporaneo:

# temp commit of your staged changes:
$ git commit --message "WIP"

# -u option so you also stash untracked files
$ git stash -u

# now un-commit your WIP commit:
$ git reset --soft HEAD^

A questo punto, avrai una scorta delle tue modifiche non organizzate e avrai solo le modifiche organizzate presenti nella tua copia di lavoro.


21
Questa è davvero la risposta corretta IMO. L' --keep-indexopzione nella risposta attualmente accettata nasconde ancora ciò che è nell'indice, ma lo mantiene anche nell'indice. Quindi è duplicato e ne deriva l'ilarità.
Ken Williams,

3
@KenWilliams <del> ilarità </del> <ins> tragedia </ins>
tuespetre

@KenWilliams Questo mi ha davvero irritato. OP puoi modificare la risposta selezionata?
MikeMurko

2
Il git add .passaggio potrebbe voler essere migliorato in git add --allquanto dovrebbe anche catturare i file in una directory sopra la directory di lavoro corrente.
Elijah Lynn

1
Questa è la risposta migliore finora, poiché l'opzione --keep-index nella risposta accettata è fuorviante. Questa dovrebbe essere la risposta accettata.
Elijah Lynn

21

Ho scoperto che la risposta contrassegnata non ha funzionato per me poiché avevo bisogno di qualcosa che nascondesse veramente solo le mie modifiche non messe in scena. La risposta contrassegnata git stash --keep-index,, nasconde sia le modifiche in scena che quelle non in scena. La --keep-indexparte si limita a lasciare intatto l'indice anche sulla copia di lavoro. Questo funziona per OP, ma solo perché ha posto una domanda leggermente diversa da quella per cui in realtà voleva la risposta.

L'unico vero modo che ho trovato per nascondere le modifiche non in scena è di non utilizzare affatto lo stash:

git diff > unstaged.diff
git apply -R unstaged.diff

git checkout -- .funzionerà anche al posto di apply -R.

Lavoro lavoro lavoro...

git apply unstaged.diff
rm unstaged.diff

1
Qui su git version 2.6.1.windows.1, ha git stash -kfunzionato come descritto.
koppor

Questa dovrebbe essere la risposta accettata! È l'unico in più thread di stackoverflow che fa ciò che afferma e non fa affidamento su commit temporanei!
user643011

1
@ user643011: i commit temporanei non sono una brutta cosa in git. Non costano nulla e non danneggiano nessuno.
Fritz

1
@Fritz: nessun commit temporaneo non è possibile in alcuni scenari. Potrebbe fallire se hai un hook pre-commit che controlla il codice di lavoro corrente. Se le modifiche a fasi sono valide ma le modifiche non a fasi non lo sono, questo approccio non riuscirà a eseguire il commit delle modifiche a fasi.
Penghe Geng

1
Questo non include i file non tracciati. Devi usare "git ls-files" per trovare e includere quelli nella patch diff
ACyclic

5

Git: nasconde le modifiche non organizzate

Questo nasconderà tutte le modifiche che non hai aggiunto:

git stash -k

Notare che i file appena creati (e non aggiunti) rimarranno nella directory di lavoro a meno che non si utilizzi anche l' -uopzione.

git stash -k -u 

Inoltre, la directory di lavoro deve essere pulita (cioè tutte le modifiche devono essere aggiunte) quando si git stash pop in seguito.

http://makandracards.com/makandra/853-git-stash-unstaged-changes


13
Questo è equivalente a git stash --keep-index. I file in fasi sono inclusi nella scorta.
Benjamin Cheah
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.