git-stash contro git-branch


92

In una precedente domanda su Git , Daniel Benamy stava parlando di un flusso di lavoro in Git:

Stavo lavorando al master e ho impegnato alcune cose e poi ho deciso che volevo sospendere quel lavoro. Ho eseguito il backup di alcuni commit e poi ho ramificato da prima di iniziare il mio lavoro di merda.

Voleva ripristinare il suo stato di lavoro a un momento precedente senza perdere le modifiche attuali. Tutte le risposte ruotavano intorno, in vari modi, a qualcosa di simile

git branch -m master crap_work
git branch -m previous_master master

Come si confronta git stash? Sono un po 'confuso cercando di vedere quale sia il diverso caso d'uso qui quando sembra che tutto git stashsia già gestito dalla ramificazione ...


@ Jordi Bunster : Grazie, questo chiarisce le cose. Immagino che considererei lo "stashing" come un ramo leggero e senza nome. Quindi qualsiasi cosa stash possa fare, anche branch può farlo, ma con più parole. Bello!

Risposte:


109

'stash' prende le cose non impegnate, " sporche " sulla tua copia di lavoro e le nasconde, lasciandoti con una copia di lavoro pulita.

In realtà non si ramifica affatto. È quindi possibile applicare la scorta sopra qualsiasi altro ramo. Oppure, a partire da Git 1.6, puoi fare:

git stash branch <branchname> [<stash>]

per applicare la scorta sopra un nuovo ramo, tutto in un unico comando.

Quindi, stash funziona alla grande se non ti sei ancora impegnato nel ramo " sbagliato ".

Se ti sei già impegnato, il flusso di lavoro che descrivi nella tua domanda è un'alternativa migliore. E a proposito, hai ragione: Git è molto flessibile e con quella flessibilità arriva la funzionalità che si sovrappone.


1
una cosa che mi morde ... puoi scrivere che aspetto ha un [<stash>]! L'hanno messo in quella notazione nei documenti, ma non è ovvio se dovrebbe essere 1 o @ {1} o cosa.
Gregg Lind,

1
Se vuoi fare riferimento a una scorta specifica "N", usa stash @ {N}
Jordi Bunster,

9
Vedi git stash listper i nomi delle tue scorte.
idbrii

6
Gregg, sì, puoi: git stash save (nome della tua scorta). Lo rende molto più utile se lo usi molto in modo da sapere cosa fa ogni scorta. Puoi usare git stash show -p (nome) per mostrarti la patch di una scorta.
Thomas Vander Stichele

7
inoltre, git stash show -uper mostrare un diff della scorta rispetto alla copia funzionante.
ken

49

Quando ripristini la tua scorta, le modifiche vengono riapplicate e continui a lavorare sul codice.

Per nascondere le modifiche attuali

$ git stash save 
Saved "WIP on master: e71813e..."

Puoi anche avere più di una scorta. La scorta funziona come una pila. Ogni volta che salvi una nuova scorta, questa viene messa in cima alla pila.

$ git stash list
stash@{0}: WIP on master: e71813e..."

Nota la stash@{0}parte? Questo è il tuo ID di scorta. Ne avrai bisogno per ripristinarlo in seguito. Facciamolo adesso. L'ID della scorta cambia con ogni scorta che fai. stash @ {0} si riferisce all'ultima scorta che hai creato.

Per applicare una scorta

$ git stash apply stash@{0}

Potresti notare che la scorta è ancora lì dopo averla applicata. Puoi lasciarlo se non ne hai più bisogno.

$ git stash drop stash@{0}

Oppure, poiché la scorta si comporta come una pila, puoi estrarre l'ultima scorta che hai salvato:

$ git stash pop

Se vuoi cancellare tutte le tue scorte, esegui il comando "cancella":

$ git stash clear

Potrebbe benissimo essere che non usi le scorte così spesso. Se desideri semplicemente archiviare rapidamente le modifiche per ripristinarle in un secondo momento, puoi omettere l'ID stash.

$ git stash
...
$ git stash pop

Sentiti libero di sperimentare con la scorta prima di usarla per lavori davvero importanti.

Ho anche una versione più approfondita di questo postata sul mio blog .


una risorsa molto più utile della presunta risposta `` migliore '' ... (anche se la risposta migliore lo ha reso molto chiaro, c'erano alcune confusioni relative al pieno utilizzo)
kumarharsh

9

Sono sempre diffidente nei confronti di git stash. Se metti da parte un paio di volte, le cose tendono a complicarsi. git stash list mostrerà un elenco numerato di stash che hai creato, con messaggi se li hai forniti ... Ma il problema sta nel fatto che non puoi ripulire gli stash se non con un brutale git stash clear (che li rimuove tutti) . Quindi, a meno che tu non sia sempre anale nel dare messaggi super descrittivi per le tue scorte (un po 'va contro la filosofia di stash), finisci con un mucchio incomprensibile di scorte.

L'unico modo che conosco per capire quale è usare gitk, tutto e individuare le scorte. Almeno questo ti consente di vedere su quale commit è stato creato lo stash, così come il diff di tutto ciò che è incluso in quello stash.

Nota che sto usando git 1.5.4.3 e penso che 1.6 aggiunga git stash pop, che immagino applicherebbe lo stash selezionato e lo rimuoverà dall'elenco. Che sembra molto più pulito.

Per ora, cerco sempre di ramificarmi a meno che non sia assolutamente sicuro che tornerò a quella scorta nello stesso giorno, anche entro un'ora.


3
Realizzi rami senza dare loro nomi utili? In caso contrario, non vedo perché non fai lo stesso con la scorta. Se vuoi davvero sapere cosa contengono, usa git-stash show per mostrare quali file sono stati modificati, o git-stash apply e git-diff per vedere le differenze effettive. Mantenere le scorte ridotte equivale a tenere sotto controllo i rami.
Xiong Chiamiov

18
in realtà, puoi eliminare una singola scorta utilizzandogit stash drop [<stash>]
kumarharsh

1
È vero, git ha avuto git stash drop per molto tempo ormai. È molto meno PITA da usare ora. Lo uso tutti i giorni, e anche per lunghi periodi di tempo, adesso.
webmat

3

Se cerchi un flusso di lavoro che potrebbe essere più adatto di git stash, potresti voler guardare git-bottle . È un'utilità allo scopo di salvare e ripristinare i vari stati di lavoro di git come normali commit di git, realizzando un'istantanea dello stato corrente e pertinente del tuo albero di lavoro e di tutti i vari stati dei file mostrati sotto git status.

Differenze chiave da git stash:

  • git stashsalva lo stato sporco di git in modo restrittivo (file modificati e file aggiunti nell'indice), mentre git-bottleè progettato per salvare tutto ciò che è diverso da HEAD, e differenzia in modo preservato tra percorsi modificati, modificati e non aggiunti, non aggiunti, non uniti, e gli stati rebase / merge completi (solo i percorsi sotto .gitignorenon vengono salvati).
  • git stashsalva per riporre gli oggetti che è necessario tenere traccia separatamente. Se ho nascosto qualcosa 2 settimane fa, potrei non ricordarmelo, mentre git-bottlesalva come commit provvisorio nel ramo corrente . L'azione inversa git-unbottleè l'equivalente del git stashpop. È possibile inviare e condividere questi commit tra i repository. Questo può essere utile per le build remote, dove hai un altro repository in un server remoto solo per la costruzione o per collaborare con altre persone sulla risoluzione dei conflitti.
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.