2010-07-02 12 views
41

He estado trabajando en línea recta:git: cómo mover algunas compromete a nueva rama

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

Ahora quiero ir hacia atrás:

git checkout C 

y pasar unas últimas compromete a una nueva rama:

Opción 1:

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

Opción 2:

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

Cómo cambiar la opción 1 y cómo hacerlo en la Opción 2?

Respuesta

70

obtener de su primer diagrama (master = CABEZA = F) a la opción 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 

Y a partir de la opción 1 para la opción 2 (recogiendo donde lo anterior izquierda apagado),

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 

para ir directamente desde su punto de partida para la opción 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

Gracias por esta respuesta detallada. – takeshin

+1

Gracias :) ¡Además, +1 por "re-jiggering"! – dokkaebi

+3

Si obtiene un error "Las actualizaciones fueron rechazadas porque la punta de su rama actual está detrás de su contraparte remota" cuando intenta enviar el maestro, necesita usar la opción --force: 'git push --force origin master' – Tamlyn

Cuestiones relacionadas