2013-08-06 13 views
6

Sto lavorando al ramo A e la funzione/attività non è stata eseguita. Quindi ho bisogno di passare ad un altro ramo B per una soluzione rapida. Quando provo ad attivare un altro ramo, Git mi costringe a salvare le mie modifiche locali altrimenti perdo tutte le mie modifiche locali.Sul ramo locale, non si desidera eseguire il commit delle modifiche, ma è necessario passare a un altro ramo

Ho bisogno di impegnare il mio codice incompleto. C'è un modo in cui posso passare da più rami senza commettere e perdere alcun codice? O c'è un modo migliore per gestire la situazione?

+0

possibile duplicato di [Risparmio Git cambia temporaneamente] (http://stackoverflow.com/questions/6800778/saving-git-changes-temporarily) –

risposta

9

Un'opzione, come mipadi demonstrates, è semplicemente utilizzare git stash.

Un'altra opzione è quella di semplicemente impegnarsi tuo attuale lavoro in corso, passare rami, e poi quando si è pronti a tornare indietro, fare un reset mista di nuovo al vostro precedente impegno:

# While working on "feature" branch, 
# you suddenly need to go work on a hotfix: 
$ git commit --all --message "Backup my feature work" 
$ git checkout -b hotfix master 

# You did your hotfix, and are ready to go back to feature 
$ git checkout feature 
$ git reset head^ 

git reset head^ volontà eseguire un ripristino misto al commit prima di eseguire un commit di backup e tutte le modifiche apportate al commit di backup verranno ripristinate nella copia di lavoro. Dal official Linux Kernel documentation for git reset (sottolineatura mia):

Ripristina l'indice, ma non l'albero di lavoro (vale a dire, i file modificati vengono conservati, ma non contrassegnati per commettere) e riporta ciò che non è stato aggiornato. Questa è l'azione predefinita.

+0

+1 Lo raccomando anche perché un 'git stash' non è correlato a nessun ramo. Fare 'git commit -a -m" stashing "' mantiene il contesto del tuo lavoro. Questa dovrebbe essere la risposta accettata. – eckes

+0

Il deposito potrebbe non essere correlato a un ramo, ma _ è basato sul commit HEAD corrente. 'git show -s stash' mostra il commit di stash come unione di due commit parent, di cui il primo è l'HEAD su cui si basa lo stash.E 'git stash [save]' senza un dato messaggio registra il nome del ramo di default. – musiphil

+0

Preferisco la memorizzazione di qualsiasi cosa temporanea perché solo un comando 'git stash' può memorizzare lo stato sia dell'indice che dell'albero di lavoro. Il commit non acquisisce le modifiche nell'albero di lavoro che non è messo in scena per l'indice. – musiphil

8

È possibile utilizzare git stash, che salverà le modifiche senza creare un commit.

In primo luogo, conserva le modifiche:

$ git stash 

quindi passare alla altro ramo:

$ git checkout branch-B 

Quando stai leggendo, tornare alla tua filiale originale e unstash le modifiche :

$ git checkout branch-A 
$ git stash pop 

Vedere la documentazione collegata sopra per maggiori dettagli e dettagli su casi d'uso aggiuntivi.


Tecnicamente si fa a creare un commit, ma git stash usa un po 'di magia in modo da non lo fai in realtà vedere il commit, e gli strumenti di Git sanno come trattare correttamente con questi pseudo-commit.

+0

bene, cosa succede se quando ho fatto alcuni cambiamenti sul ramo-B e impegnato con loro, non impegnerà il nostro ramo - A cambiamenti? – Suleman

Problemi correlati