2011-01-07 20 views
14

Di solito mi succede che apporto alcune modifiche locali, solo per scoprire che l'ho fatto sul ramo sbagliato, quindi ho bisogno di cambiare ramo prima di impegnarmi. Il problema è che non posso cambiare ramo quando ci sono cambiamenti locali. C'è comunque per farlo?GIT: aggiunta di modifiche locali a un ramo non corrente

Ovviamente, posso copiare i file aggiornati, cambiare ramo, quindi copiarli indietro, ma questo non sembra davvero intelligente!

risposta

16

È possibile cambiare diramazione mentre si hanno modifiche locali a meno che le modifiche locali non siano in conflitto con la differenza tra i due rami. In questo caso è possibile utilizzare l'opzione -m o --merge a checkout per eseguire comunque la verifica ed eseguire un'unione tra le modifiche e le modifiche causate dal cambio di filiali.

git checkout -m other-branch 
9

Io uso git stash quando ciò accade. Crea un commit temporaneo dello stato corrente della copia di lavoro (entrambi i file memorizzati nella cache e non collegati) e ripristina la copia di lavoro nell'HEAD corrente. Quindi è possibile passare all'altro ramo e fare git stash pop.

+0

Dolce. Devi solo assicurarti che i tuoi cambiamenti siano messi in scena. Funziona perfettamente. – helios

+0

molto lucido, sicuramente qualcosa di nascosto rende davvero facile fare – Martin

2

Come detto da altri è possibile utilizzare stash o checkout --merge. Quelle opzioni tuttavia causeranno un cambiamento nel timestamp di alcuni file. Se stai lavorando su un progetto di grandi dimensioni in cui la compilazione può richiedere molto tempo (il nostro progetto attuale richiede mezz'ora per la compilazione con build distribuite), questo potrebbe non essere ottimale.

In questa situazione, è possibile utilizzare un altro repository per spostare il commit sul ramo corretto. In primo luogo, è necessario clonare il repository corrente (questo bisogno di essere fatto solo una volta):

$ git clone /path/to/repository repository.clone 
$ cd repository.clone 
$ git remote add origin repository.clone 
$ git fetch origin 

Poi, nel tuo archivio corrente, i vostri cambiamenti:

$ cd /path/to/repository 
$ git add path/to/modified/files 
$ git commit -m 'Commit message' 

D'altra repository , si recupera il nuovo commit, e spostarlo al ramo corretto:

$ cd ../repository.clone 
$ git fetch origin 
$ git checkout correct-branch 
$ git reset --hard origin/correct-branch 
$ git cherry-pick origin/current-branch 
$ # resolve conflicts if any, commit with -c option in this case 
$ git push origin correct-branch:correct-branch 

Poi sul repository originale, rimuovere il commit temporanea, e rimuovere la modifica associata (tranne se si vuole k emettile in entrambi i rami).

$ cd /path/to/repository 
$ git reset HEAD^ 
$ # edit file and remove modifications moved to other branch 

questo è più complessa e coinvolge la storia riscrittura, ma quando il progetto sono veramente grandi, e tempo di compilazione è un fattore limitante, può essere grande per conoscere la tecnica. Si noti che è possibile riutilizzare il repository clonato, quindi non è necessario eliminarlo/ricrearlo ogni volta (se il tempo di compilazione è lungo, il repository è probabilmente grande e la clonazione può richiedere del tempo).

Problemi correlati