2010-07-02 12 views
41

Ho lavorato in linea retta:git: come spostare alcuni commit al nuovo ramo

A---B---C---D---E---F (master:HEAD) 

Ora voglio tornare indietro:

git checkout C 

e spostare qualche ultimi commit per una nuova filiale:

Opzione 1:

  D---E---F (new:HEAD) 
     /
A---B---C (master) 

Opzione 2:

  F (new:HEAD) 
     /
A---B---C (master) 

Come REBASE all'opzione 1 e come opzione 2?

risposta

70

di ottenere dal vostro primo schema (master = HEAD = F) per l'opzione 1:

git branch new  # Make a 'new' branch pointing at HEAD, which is F 
git reset --hard C # Move master back to point at C 
git checkout new  # Make HEAD follow new, and get F in the working tree 

E da l'opzione 1 per l'opzione 2 (ripartendo da dove l'alto a sinistra off),

git rebase -i master # Start the process of re-jiggering this branch 
# edit the commit list that opens up to only include F 
# save and exit 
# resolve potential conflicts from missing changes in D and E 

per andare direttamente dal vostro punto di partenza per l'opzione 2:

git checkout -b new C # Start the 'new' branch at C 
git cherry-pick F  # Include F on it 
git checkout master # Switch back to master 
git reset --hard C  # Rewind master to the earlier commit 
+2

Grazie per questa risposta dettagliata. – takeshin

+1

Grazie :) Inoltre, +1 per "re-jiggering"! – dokkaebi

+3

Se si riceve un errore "Gli aggiornamenti sono stati rifiutati perché la punta del ramo attuale è dietro la controparte remota" quando si tenta di spingere il master, è necessario utilizzare l'opzione --force: 'git push --force origin master ' – Tamlyn

Problemi correlati