2012-10-31 26 views
5

Mi aspetto git checkout <commit> per far lampeggiare sia l'albero di lavoro che l'indice alla versione <commit>. Tuttavia, in alcuni casi manterrà le modifiche correnti sia nella struttura che nell'indice di lavoro. Per esempio:Git: git checkout con albero di lavoro modificato e indice

git branch br1 
git branch br2 
git checkout br1 
<make change M1 to file foo> 
git add foo 
<make change M2 to file foo> 
git checkout br2 

Ora tutte le modifiche di lavoro albero/indice composto nel ramo br1 sono conservati nel ramo br2, come git status su br2 non darà un messaggio pulito. Immagino che questo sia dovuto al fatto che la testata di br1 e br2 originariamente abbia la stessa versione del file foo, e Git può rilevarlo automaticamente.

Domanda:

  • Quando fa Git decide di non lampeggiare l'albero di lavoro e l'indice? Ci sono altri casi d'angolo?
+1

Questo non è un caso angolare, l'idea è che si può decidere che prima di commettere si voglia commettere su un nuovo ramo. Finché il passaggio da un ramo all'altro non sovrascriverà alcun file modificato/causerà problemi per il git dell'indice, semplicemente passerà al ramo. –

+0

@ X-Istence Ma come decide git ** non causerà problemi **? – Cyker

risposta

5

Il comando git checkout ha in realtà due diverse modalità operative (comuni).

  1. Se si esegue git checkout <branch>, poi si passa al ramo <branch>. Verranno mantenute tutte le modifiche all'albero di lavoro, e questo funziona unendo le modifiche non vincolate al ramo di destinazione, in modo che possa fallire. Le modifiche all'indice saranno nascoste.

  2. Se si esegue git checkout <path>, quindi git cancellerà le modifiche a <path> sia nell'indice che nella copia di lavoro ottenendole dal commit corrente.

Quindi lo scopo di git checkout <branch> è nel caso in cui si decide che le modifiche che state facendo in realtà appartengono a un ramo diverso.