Immagina di lavorare su una funzione in un progetto software controllato da Git. Hai ragione nel fare alcune modifiche quando ricevi una richiesta per correggere un bug critico. Per iniziare a risolvere il problema, è necessario un nuovo ramo e una directory di lavoro pulita. Quando si tratta di comandi Git di base, hai due opzioni:
git reset --hard
per rimuovere le modifiche non salvate.L'opzione precedente perde tutto il tuo lavoro, mentre il secondo si traduce in un commit parziale che non è significativo. Nessuno di questi scenari è tutto ciò che è desiderabile.
Questo è dove il git stash
comando entra in gioco. Piace git reset --hard
, ti fornisce una directory di lavoro pulita, ma registra anche le modifiche incomplete internamente. Dopo aver corretto il bug critico, è possibile riapplicare queste modifiche e riprendere da dove si era interrotto. Puoi pensare git stash
come un "pulsante di pausa" per il tuo lavoro in corso.
Questo tutorial presume che tu abbia installato Git e che tu abbia familiarità con il suo flusso di lavoro di base. Dovresti essere a tuo agio nelle modifiche alla messa in scena, nella creazione di commit e nel lavoro con le filiali. Avrai anche bisogno di un repository Git per sperimentare.
Prima di poter correre git stash
, è necessario avere alcune modifiche non vincolate nel tuo repository Git. Ad esempio, se hai modificato un file chiamato foo.py
, il tuo stato git
l'output sarebbe simile a questo:
Sul master del ramo Modifiche non modificate per il commit: (utilizzare "git add... "per aggiornare ciò che sarà impegnato) (usa" git checkout -- ... "per eliminare le modifiche nella directory di lavoro) modificato: foo.py
Per mettere da parte queste modifiche, semplicemente esegui git stash
senza argomenti.
git stash
Ciò comporterà sia le modifiche graduali che quelle non modificate, le registrerà internamente, quindi cancellerà la directory di lavoro. Questo ti dà l'opportunità di passare a una nuova filiale e sviluppare altre funzionalità senza preoccuparti del fatto che il tuo commit parziale non funzioni nulla.
Quando sei pronto per tornare al tuo lavoro incompleto, esegui il seguente comando per riapplicare le modifiche nascoste:
git stash pop
Il changeset memorizzato più recentemente riappare nella tua directory di lavoro e puoi continuare esattamente da dove eri rimasto. Questo è tutto ciò che c'è da fare.
Molto simile al git si fondono
comando, git stash pop
può causare conflitti se le stesse sezioni del codice sorgente sono cambiate da quando è stato eseguito git stash
. Quando ciò accade, vedrai il seguente messaggio dopo l'esecuzione git stash pop
:
Auto-merging foo.py CONFLICT (contenuto): Unisci conflitto in foo.py
Troverai anche il file interessato elencato sotto Percorsi non interrati
sezione in stato git
output, così come le righe interessate nel file sorgente.
<<<<<<< Updated upstream print("Recently committed changes"); ======= print("Incomplete work"); >>>>>>> modifiche nascoste
Dovrai risolvere manualmente il conflitto nel file sorgente, ma di solito non vuoi commetterlo immediatamente come faresti dopo git si fondono
conflitto. La maggior parte delle volte continuerai a lavorare sulla funzione incompleta finché non avrai preparato un commit significativo. Quindi, puoi semplicemente aggiungerlo all'indice e commetterlo come al solito. In altre parole, puoi trattare git stash pop
conflitti come qualsiasi altra modifica non salvata.
Per la maggior parte degli scenari, i comandi di cui sopra sono tutto ciò che serve quando si tratta di un "pulsante di pausa". Ma capire come sono rappresentati i cambiamenti nascosti apre la porta ad un uso più avanzato.
Finora, abbiamo solo parlato di immagazzinare un singolo changeset. Tuttavia, ogni volta che corri git stash
, le modifiche non salvate sono memorizzate su una pila. Ciò significa che è possibile memorizzare più changeset contemporaneamente.
Questo è utile nelle prime fasi di sviluppo quando non sei sicuro di quale direzione vuoi prendere. Invece di perdere le tue modifiche con git reset --hard
, puoi mantenere le tue istantanee work-in-progress nella pila di scorta nel caso in cui tu voglia riapplicarle una dopo.
Puoi ispezionare la pila di scorta con il elenco
parametro.
lista di scorta git
Se avevi precedentemente eseguito git stash
tre volte, questo produrrebbe qualcosa come il seguente:
stash @ 0: WIP on new-feature: 5cedccc Prova qualcosa di pazzo stash @ 1: WIP on new-feature: 9f44b34 Scatta una diversa direzione stash @ 2: WIP on new-feature: 5acd291 Inizia nuova funzionalità
Il git stash pop
comando re-applica sempre l'istantanea più recente, quella nella parte superiore della pila di riserva. Ma è anche possibile scegliere quale snapshot nascosta si desidera riapplicare con applicare
comando. Ad esempio, se si desidera riapplicare la seconda serie di modifiche, si utilizzerà il seguente comando:
git stash apply stash @ 1
Proprio come git stash pop
, le modifiche verranno visualizzate nuovamente nella directory di lavoro e sarà possibile continuare a lavorare sulla funzione incompleta. Nota che questo non rimuoverà automaticamente lo snapshot dalla pila di scorta. Invece, dovrai eliminarlo manualmente con far cadere
comando.
git stash drop stash @ 1
Ancora una volta, lavorare con lo stack stash è più di un caso limite per la maggior parte degli utenti Git. Il git stash
e git stash pop
i comandi dovrebbero essere sufficienti per la maggior parte delle tue esigenze, sebbene lista di scorta git
può anche rivelarsi utile se hai dimenticato dove si è svolta l'ultima operazione di stoccaggio.
L'invio di istantanee significative è al centro di qualsiasi flusso di lavoro Git. Impegni mirati e incapsulati rendono molto più facile navigare nella cronologia del progetto, capire dove sono stati introdotti i bug e annullare le modifiche.
Anche se non è esattamente un comando quotidiano, git stash
può essere uno strumento molto utile per la creazione di commit significativi. Ti consente di archiviare il lavoro incompleto evitando la necessità di impegnare istantanee parziali nella cronologia del progetto permanente. Tienilo a mente la prossima volta che vorrai poter mettere in pausa ciò che stavi lavorando e tornare più tardi.