2009-08-20 22 views
229

Stavo lavorando su un ramo git ed ero pronto a confermare le mie modifiche, quindi ho eseguito un commit con un messaggio di commit utile. Poi, in modo assente, ho apportato lievi modifiche al codice che non vale la pena conservare. Ora voglio cambiare succursale, ma mi dà git,git: cambia ramo e ignora qualsiasi modifica senza commit

error: You have local changes to "X"; cannot switch branches.

Ho pensato che potevo cambiare ramo senza commettere. Se è così, come posso configurarlo? Altrimenti, come posso uscire da questo problema? Voglio ignorare le modifiche minori senza commettere e cambiare i rami.

+1

Credo che questo accade solo quando le modifiche sono in scena per commettere, ma non commited? git checkout funziona bene per cambiare rami se non hai ancora messo in scena i file usando git add o simili. –

+1

Ciao Jeremy, Cosa intendi con "messo in scena"? Forzare l'utente a salvare il file prima che le diramazioni non sembrino un grande flusso di lavoro. Ad esempio, se sono nel repository principale e voglio rapidamente controllare qualcosa in un ramo. Devo prima affidare il codice al master, anche se il codice è scritto a metà! Stai dicendo che in effetti dovrebbe essere possibile effettuare il checkout di un ramo in questa situazione? –

+0

@boyfarrell È possibile utilizzare 'Git stash' per salvare temporaneamente le modifiche senza commit. – Howiecamp

risposta

297

Per cambiare ramo è necessario uno stato pulito. Il checkout delle filiali sarà consentito solo se non influisce sui "file sporchi" (come le osservazioni Charles Bailey nei commenti).

In caso contrario, si dovrebbe neanche:

  • stash tuo attuale modifica o
  • reset --hard HEAD (se non ti dispiace perdere quei cambiamenti minori) o
  • checkout -f (Quando si passa rami, procedere anche se il indice o albero di lavoro diverso da HEAD. Questo viene utilizzato per eliminare le modifiche locali.)
+28

"È necessario uno stato pulito per cambiare rami." è vero solo se la modifica del ramo ha effetto sui "file sporchi". –

+0

Grande risposta di VonC e commento di Charles Bailey –

+6

Per il metodo stash, ho digitato "git stash save", "git checkout otherbranch", infine "git stash pop". –

7

Se sono state apportate modifiche ai file che Git deve modificare anche quando si passa da un ramo all'altro, questo non lo consente. Per annullare le modifiche di lavoro, utilizzare:

git reset --hard HEAD 

Quindi, sarà possibile cambiare ramo.

12

Seguire,

$: git checkout -f 

$: git checkout next_branch 
90

Se si desidera annullare le modifiche,

git checkout -- <file> 
git checkout branch 

Se si desidera mantenere le modifiche,

git stash save 
git checkout branch 
git stash pop 
+8

In effetti ciò che dice Romerun (per essere completo): 'git stash save' (quando si lavora in branchY) quindi' git checkout branchX' fa qualcosa 'git add/commit -m' ecc.' Git checkout branchY' e 'git stash pop 'per riprendere lo stash – Highmastdon

+2

Forse così. Ho una situazione in cui voglio fare quello che dice la risposta, se sto capendo bene: memorizza i cambiamenti, passa da Y a X, quindi compila i cambiamenti e li commetto su X. –

51

bene, dovrebbe essere

git stash save 
git checkout branch 
// do something 
git checkout oldbranch 
git stash pop 
+3

Sì, lo stash è globale, non ramo specifico, se immagazzino pop dopo aver cambiato ramo, otterrò la stessa scorta degli altri rami –

+4

Dovrebbe essere notato 'git stash' sarà predefinito per' git stash save' –

+0

Grazie, è molto utile per me –

7

Nota che se hai unito filiali remote o hai un commit locale a d voglio tornare alla TESTA remota che si deve fare:

git reset --hard origin/HEAD 

solo HEAD farà riferimento solo al locale commettere/merge - più volte ho dimenticato che quando il ripristino e finire con "il repository è X commette in anticipo .. "quando ho completamente intenzione di nuke TUTTE le modifiche/commit e ritorno al ramo remoto.

0

passaggio a un nuovo ramo modifiche perdere:

git checkout -b YOUR_NEW_BRANCH_NAME --force 

di commutazione ad un ramo già esistente cambia perdere:

git checkout YOUR_BRANCH --force 
Problemi correlati