2013-12-12 18 views
23

Se lavoro sul ramo A e improvvisamente ho bisogno di lavorare sul ramo B prima di essere pronto con un commit sul ramo A, ho nascosto le mie modifiche su A, checkout B, faccio il mio lavoro lì, poi checkout A e applica lo stash.Quando dovrei usare git stash?

Se lavoro su A e voglio smettere di lavorare per il giorno, dovrei riporre il mio lavoro e poi applicarlo il giorno dopo, quando riprendo il mio lavoro, o dovrei semplicemente lasciare le cose come sono - non modificato file nella directory di lavoro. Non vedo perché avrei bisogno di usare lo stash in questo caso, eccetto se ci sono dei benefici per la sicurezza.

Inoltre, un altro scenario: lavoro sia a lavoro che a casa. Se non sono pronto con un commit quando voglio andare a casa, posso mettere da parte il mio lavoro, spingerlo a GitHub e poi tirarlo a casa?

risposta

31

Stash è solo un metodo di convenienza. Poiché i rami sono così economici e facili da gestire in git, personalmente preferisco quasi sempre creare un nuovo ramo temporaneo piuttosto che nasconderlo, ma è una questione di gusti per lo più.

L'unico posto che mi piace stashing è se scopro ho dimenticato qualcosa nella mia ultima commit e hanno già iniziato a lavorare su quello successivo nello stesso ramo:

# Assume the latest commit was already done 
# start working on the next patch, and discovered I was missing something 

# stash away the current mess I made 
git stash save 

# some changes in the working dir 

# and now add them to the last commit: 
git add -u 
git commit --ammend 

# back to work! 
git stash pop 
1

Il comando di memoria riporterà tutte le modifiche apportate dall'ultimo commit. Nel tuo caso non c'è motivo di nasconderlo se continuerai a lavorarci il giorno dopo. Utilizzerei solo la memoria per annullare le modifiche che non si desidera eseguire il commit.

+0

No, 'git stash' non cambierà il ramo. Soprattutto non "ripristinerà" alcuna modifica impegnata. Rimuoverà (temporaneamente) tutte le modifiche non salvate sui tuoi file. - Potrebbe sembrare schizzinoso, ma questo tipo di parole ha un significato molto speciale nel contesto di git. Non dovresti davvero mescolarli. – michas

+0

Grazie per averlo indicato. Ho cambiato la mia risposta di conseguenza. – Severin

+0

In git un "ramo" è definito come una serie di commit. 'git stash' non toccherà nessun commit e quindi non modificherà alcun ramo. Non "rimuoverà" nulla da un ramo e non lo "resetterà" in alcun modo. Il ramo rimane lo stesso, solo i file nell'albero di lavoro cambiano. - Queste sono due cose completamente diverse. – michas

0

se si ha colpito git stash quando si ha cambiamenti nella copia di lavoro (non nell'area di staging), git creerà un oggetto nascosto e spingerà sulla pila di ripostigli (proprio come hai fatto con lo git checkout -- . ma non perderesti le modifiche). Più tardi, puoi saltare dalla cima della pila.