2011-08-27 10 views
11

Supponiamo di dover eseguire un refactoring di durata media (diversi giorni).Come schiacciare le mie modifiche in un singolo risultato, commettere e selezionare nel ramo principale?

Creo "mybranch" dal master, eseguo il lavoro, a volte eseguo le unioni da master a mybranch (alcuni membri del team suppongono di continuare il lavoro e probabilmente avrò bisogno di ottenere le loro modifiche). E dopo un po 'sono pronto per unire le mie modifiche al master.

Sarò in grado di schiacciare solo le mie modifiche (esclusi i changeset con unioni da master, poiché non sono le mie) e selezionare un singolo commit dei miei lavori nel master? È possibile fare uno scenario?

risposta

7

Sì. Puoi confermarlo con un piccolo repository di test. Basta fare:

git rebase --interactive master mybranch 

e scegli squash per tutte le linee tranne la prima. Quindi esegui il checkout master e esegui una normale fusione veloce di mybranch.

+0

Oh, è anche sarà un avanzamento veloce? Senza l'obbligo di selezionarlo? "per tutte le righe tranne la prima" --- che cosa è "prima" in questo caso?E potrei schiacciare tutto tranne le unioni (suppongo che farò diverse fusioni da master nel processo del lavoro) – zerkms

+0

corretto. Rebase produce sempre una cronologia ad avanzamento rapido. In sostanza, risolvi tutti i conflitti prima dell'unione anziché dopo. –

+0

ok, bello, grazie – zerkms

4

Dopo rebasing, non ci sarà alcun riferimento su quelle impegna a precedente "mybranch"

cosa farò e potrebbe essere più la sicurezza è che

git checkout mybranch 

Creare un ramo (in realtà è un ramo temporaneo a scopo ribasante)

git checkout -b movingToMaster 

Provare a rebase il movingTomaster-master

git rebase -i master 

Un editor verrà richiesto fuori voi che impegnano deve essere raccolto, o schiacciato o modificare chiedendo ...

Modifica che i file, nel tuo caso, la prima linea dovrebbe tenere rimangono gli stessi e l'altro linea dovrebbe cambiare "pick" in "squash", è possibile modificare il messaggio di commit se lo si desidera. Salvalo dopo aver apportato abbastanza modifiche a quel file.

cioè

pick 0a81405 Bug Fix 1 
pick 91be655 Bug Fix 2 
pick 1200fc7 Bug Fix 3 
pick 1211fb7 Bug Fix 4 
pick ba77fdf Bug Fix 5 

Scelgo

pick 0a81405 Bug Fix 1 
squash 91be655 Bug Fix 2 
squash 1200fc7 Bug Fix 3 
squash 1211fb7 Bug Fix 4 
squash ba77fdf Bug Fix 5 

salvarlo. Poi

git checkout master 

Spostare il ramo master-movingTomaster ramo utilizzando Fast forward unire

git merge movingTomaster 

Nota: sarà nulla di male in quanto è solo una stampa veloce avanti e non ingombrare la vostra storia.

cancellare i tuoi ramo movingTomaster se si vuole

git branch -D movingTomaster 
+0

Sì, ti ho preso. Grazie. Ma non è possibile ottenere la linea "e spostare il ramo principale verso il ramo MovingTomaster" – zerkms

+0

@zerkms: a quel punto, il ramo principale non ha ancora il commit "singolo". Il tuo ramo MovingTomaster dovrebbe essere ora un altro commit avanti e poi master. (puoi visializzare con il comando gitk) Devi spostare il tuo ramo master fino allo stesso punto di commit con movingTomaster –

+0

Come si può eseguire questo "spostamento"? Non è solo una fusione (inoltrata rapidamente in questo caso)? – zerkms

Problemi correlati