2011-05-17 17 views
19

Me gustaría trasladar mis últimos commits de master a una rama propia.¿Cómo mover confirmaciones a otra sucursal?

El árbol en mi PC parece que:

W (some branch) 
/  
X1--X2--X3--X4--Y--Z1--Z2 (master) 

me gustaría que se vea como:

W (some branch) 
/  
X1--X2--X3--X4 (master) 
      \ 
       Y--Z1--Z2 (my new branch) 

Sin embargo, el árbol en GitHub parece:

W (some branch) 
/  
X1--X2--X3--X4--Y (master) 

Eso es lo que vi como una solución para mover los últimos commits a otra rama:

git checkout master 
git branch my_new_branch 
git reset <commit_id> 

Mi pregunta es: ¿sería capaz de presionar con éxito a GitHub después de mover las confirmaciones a una nueva rama y, de ser así, necesitaría hacer algo más que estos tres comandos?

+1

¿No desea Y en master o simplemente quiere que su rama comience desde X4? Quiero decir, ¿es que Y estar en el maestro es un error? – CharlesB

Respuesta

16

(supongo <commit_id> es el nombre del objeto de X4 ...)

Esos comandos de hecho que va a terminar con lo que quiere localmente. (Es posible que desee utilizar git reset --hard para mantener el árbol de trabajo y el índice al igual que la confirmación que está restableciendo, pero como de costumbre, tenga mucho cuidado de que git status esté limpio antes de usar ese comando.)

Si después Intenta enviar maestro a GitHub, te dirá que todo está actualizado, porque el master en GitHub es una apuesta por delante. Puede forzar el impulso, para que el maestro se reinicie en GitHub, pero eso es reescribir la historia pública, por lo que solo debe hacer eso si (a) usted es el único que habrá buscado master de GitHub o (b) puede dejarlo sus colaboradores saben qué hacer para que accidentalmente no se funden de nuevo en Y Si eso está bien, que puede hacer:.

git push --force origin master 

... y luego master en GitHub será el mismo que la versión local.

+1

+1 durante 6 segundos;) – VonC

+0

Del mismo modo +1 para su respuesta más breve - ¡7 segundos es duro para una pregunta de 16 minutos! –

+0

Gracias Mark. Soy el único que se compromete con el proyecto por el momento. Un hombre realmente ha bifurcado el proyecto, pero él está trabajando por su cuenta. Entonces, en ese caso, no hay ningún peligro teórico para mí, arruinando mi historial de proyectos, y para él, ¿tiene problemas con su tenedor? Perdón por mis preguntas bastante * no muy brillantes *. :-) –

3

Se debe trabajar, pero tendrá que:

  • a push -f origin master (forzar el empuje, lo que significar un problema si alguien más ya ha clonar tu repositorio)
  • para empujar entonces su nueva rama (que se a continuación, busque el X4 sha1 sobre el cual se establecerá dicha nueva bifurcación).
0

Nadie ha mencionado que simplemente puede seleccionar la confirmación en otra rama. De esta forma, su mensaje de compromiso seguirá estando allí para usted.

Solo copie la identificación de revisión de la confirmación que desea mover. git log --oneline

que crear una nueva rama en la parte superior de la antigua comprometerse y cambiar a ella: git checkout -b "$newBranchName" HEAD~$n (CABEZA ~ $ n representa el enésimo comprometerse) o git checkout -b "$newBranchName" $formerRevsion

Ahora sólo tienen para seleccionar con precisión la confirmación deseada: git cherry-pick $revision

La confirmación anterior seguirá estando en la otra rama, pero puede corregirla con rebase. Regrese a su antigua bifurcación y use rebase: git rebase -i HEAD~$n

Simplemente elimine la línea de confirmación de la confirmación seleccionada y su bifurcación se actualizará sin ella. Debe usar git push -f porque las revisiones de todos los commit rebasados ​​han cambiado.

Cuestiones relacionadas