2012-08-28 6 views
5

tengo la siguiente situación:Comienza una rama demasiado tarde, cambie el padre de mi rama

A---B---F---G---H (master) 
    \ 
     \ 
     C---D---E (experimental) 

Mi problema es que B es un muy, muy malo que no debería haber ocurrido en master. Pertenece al experimental. Sin embargo, F --- G --- H están bien. ¿Hay una manera de hacer que todo se vea como esto:

A---F'---G'---H' (master) 
\ 
\ 
    B---C---D---E (experiment) 

He leído sobre rebase y cosas por el estilo, pero el mayor problema es que master ha sido empujado a origin.

+0

¿Hay demasiadas personas en el equipo para informar manualmente si rebase maestro? Si es así, simplemente puede 'git revertir B' – bcmcfc

+0

Necesito mantener B en la rama de experimento –

Respuesta

3

git rebase --onto A B master hará.

Parece que ya tiene el master forzado para iniciar, si está seguro de que es seguro sobreescribir la rama principal del origen, solo haga un git push -f en la rama principal. Tenga en cuenta que puede causar que otros desarrolladores tengan un conflicto cuando lo extraen del origen.

Generalmente, la sucursal en el repositorio público no debe modificarse, lo que significa que no puede esperar eliminar el compromiso B del maestro; todo lo que puede hacer es corregir el error introducido por el compromiso B en un nuevo compromiso y empujarlo nuevamente al maestro.

Si es posible informar a los miembros de su equipo sobre la base de datos y usted insiste en hacerlo, entonces está bien reescribir, solo asegúrese de que esto no ocurra con demasiada frecuencia.

+0

Esto contradice' No rebase los commits que ha enviado a un repositorio público 'de http: // git- scm.com/book/es/Git-Branching-Rebasing –

+1

Sí, pero lo que estás preguntando es una reescritura de la historia que 'git rebase' es solo la herramienta para esta condición. En general, la sucursal en el repositorio público debe permanecer tal como está, lo que significa que no puede esperar eliminar el compromiso B en el maestro, todo lo que puede hacer es corregir el error introducido por B en un nuevo compromiso y volver a presionarlo. Pero si es posible informar a los miembros de su equipo sobre la rebase, que está bien para una reescritura, solo asegúrese de que esto no ocurra con demasiada frecuencia. – weynhamz

+0

Usaré esta opción. ¡Gracias! –

5

En maestro, ejecute:

git revert B

entonces Usted puede empujar de forma segura, si los cambios aguas abajo de esa confirmación no se ven afectados por ella directamente (es decir, el contenido de la confirmación B se puede quitar sin molestar a los otros cambios que se produjeron después de que ciertamente suena como este es el caso)

esto crearía:..

A---B---F---G---H---I (master) 
    \ 
     \ 
     C---D---E (experimental) 

Donde I es el compromiso de revertir. El maestro mantiene su historial mientras elimina los contenidos de B, los cambios experimentales de B experimentales.

Es posible que deba revertir el compromiso I si luego fusiona experimental en maestro.

+3

Gracias por su respuesta, pero hace que la historia se vea complicada, por lo que creo que me arriesgaré a enojar a mis 2 compañeros desarrolladores e iré con rebase. +1 para ti sin embargo. –

Cuestiones relacionadas