2011-08-27 17 views
7

Tengo algunos compromisos de git no apurados en mi hijo de nuestra rama principal. Hice una rebase a una rama de características, y fusioné con éxito los pocos conflictos que resultaron, pero no me di cuenta de que la rebase no me dejaría en la rama de características. Si ahora compruebo la rama de características, presumiblemente sobreescribiré mis cambios comprometidos en mi árbol de trabajo, dejándolos en una especie de limbo. Podría "git checkout -m", pero aparentemente solo es para fusionar cambios locales no confirmados. ¿Cómo puedo acceder a la rama de características y mantener mis cambios no enviados pero comprometidos que tengo actualmente bajo la rama principal (sin empujarlos a la rama principal)? ¿Debería haber usado git rebase -onto? Si es así, ¿qué debería hacer ahora que he actualizado el sistema sin -onto?cómo mover cambios comprometidos pero no apilados a otra rama?

+0

No es una tontería. Es un problema muy diferente con los cambios que ya están comprometidos, sin mencionar que han pasado por una base de datos incorrecta. –

Respuesta

7

Puede hacerlo de esta manera:

  1. git checkout branch a la comprobación de la rama de la característica.
  2. git reset --hard master para mover la rama para que sea la misma confirmación como master en este momento. Al hacer esto, pierdes todas las confirmaciones que están en la rama. Debido a su rebase, todas esas confirmaciones deben tener copias en master, por lo que en realidad no debería perder nada.
  3. git checkout master para finalizar la compra master.
  4. git reset --hard origin/master para restablecer master al estado que está en el repositorio origin. Esto supone que no tuvo ningún cambio no previsto en master. Si lo hace, reemplace origin/master con la identificación de confirmación que desea restablecer.
+0

"pierde todas las confirmaciones que están en la sucursal ..." No sigo esta parte. Mi objetivo es mantener mis compromisos no movidos moviéndolos a la rama de características. "esto supone que no tuvo ningún cambio no utilizado en el maestro". Nuevamente, los commits sin apresurar son la razón por la cual hago mi pregunta. – BrianHoltz

+0

Veo que lo que quiero hacer se describe en la página del manual de git-reset en "Deshacer una confirmación, convirtiéndola en una rama temática". – BrianHoltz

+0

La página de git man mencionada por BrianHoltz está aquí: http://git-scm.com/docs/git-reset/2.0.0#_examples –

3

Primero para replantear su situación para asegurarse de que entendí correctamente. Hizo algunas confirmaciones en master y quería moverlas al feature, por lo que ejecutó git rebase feature? Primero, quieres deshacer eso. Suponiendo que aún tiene master prestado, y no ha hecho ninguna rebases desde entonces, ejecute git reset --hard ORIG_HEAD para deshacer la rebase.

Ahora, por la forma correcta de mover sus confirmaciones a la sucursal feature. Hacer, y obtenga una rama temporal para que no se juega hasta master:

git checkout -b temp 

Ahora reajustar todos los cambios realizados desde la última confirmación de origin/master en feature:

git rebase --onto feature origin/master 

que se mueve la rama temp como si fue ramificado desde feature. Ahora para combinar los cambios en feature, hacer:

git checkout feature 
git merge temp 
git branch -d temp 

Será una combinación de avance rápido ya que sólo se restablecen.

Cuestiones relacionadas