2010-05-27 17 views
39

El título no es muy claro. Lo que realmente necesito hacer a menudo es el siguiente:¿Cómo mover una rama hacia atrás en git?

Digamos que tengo un desarrollo pasando con varias entregas C1, C2, ... y 3 ramas A, B, C

c1--c2--c3--(B)--c4--(A,C) 

Rama Un y C están en el mismo compromiso.

Ahora quiero rama A para volver donde B es, de modo que loks como esto:

c1--c2--c3--(A,B)--c4--(C) 

importante es que esto tiene que suceder a nivel local y en github.

Respuesta

58

usar el subcomando de reinicio:

git checkout A 
git reset --hard B 
git push --force github 

Como comentario, usted debe tener cuidado al usar git reset mientras que una rama ha sido empujado en otro lugar ya. Esto puede causar problemas a aquellos que ya han verificado sus cambios.

+3

Si hay ningún commit en rama A, que se perderá por 'git restablecer B' --hard. Si hay commits en la rama A, entonces debes usar 'git rebase' para reubicar la rama. –

+0

¿Qué problema exactamente podría causar? –

+0

Puede tirar la cabeza de una rama que empujó hacia el servidor y mientras tanto es tirada por otros. El servidor no puede construir encima de esta cabeza eliminada (por lo que la inserción debe forzarse). Y del mismo modo, los desarrolladores pares también necesitan forzar un tirón que puede no ser deseado. –

22

Si no hay confirmaciones en la rama A, entonces git reset --hard Bsolution given by Bram Schoenmakers funcionará.

Sin embargo si hay cometa, está rama A que debe preservarse, a continuación, el siguiente debe hacer el truco:

  1. Haga una copia de seguridad de su cesión temporal (por si acaso)
  2. git checkout A
  3. git rebase -i --onto B SHA1-A^

... SHA1-A^ donde es el identificador de confirmar sobre el padre de su rama A

Consulte el git rebase man page para obtener más información.

NOTA: Esto reescribirá el historial (como lo hace siempre la rebase). Se debe tener especial consideración si su rama A alguna vez fue empujada a un repositorio público.

1

Elimine la rama tanto de forma local como remota, recree la rama, vuelva a insertar la rama en el servidor.

git branch -d A 
git push origin :heads/A 
git branch B A 
git push origin A:A 

Alternativamente, puede utilizar el siguiente comando para deshacer esa última confirmación.

git revert c4 

que harán de su línea de tiempo vea como:

c1--c2--c3--(B) 
      \ 
       c4--(C) 
       \ 
       (^c4)--(A) 

donde (^c4) es una confirmación de que deshace c4

No recomiendo el uso de rebaserevert o en una rama que ha sido empujado a un repositorio remoto, pueden causar toneladas de problemas para usted o cualquier otra persona que utilice ese repositorio.

+0

Eliminar y volver a crear la rama remota también causará toneladas de problemas para cualquiera que use el repositorio. (Como aprendí de una experiencia dolorosa) – ebneter

+0

¿Cuál es el problema? Hago esto todo el tiempo y nunca causa ningún problema, pero ahora me pregunto si acabo de tener suerte. – kubi

3

que suelen utilizar esta secuencia y resulta la forma más sencilla:

git checkout B 
git branch -f A B