2011-11-01 34 views
7

Nuestro equipo utiliza solicitudes de extracción de Github para administrar nuestro flujo de trabajo, al igual que what is described here. Al revisar manualmente la Solicitud de extracción aceptada, ocasionalmente necesitamos revertir esa combinación porque no está lista para su implementación en nuestros servidores de producción.Revertir una compilación de fusión de git, y luego revertir la revertir

Sin embargo, si un desarrollador intenta emitir una solicitud de extracción nuevamente, no reconoce que estos cambios se revertieron y ve que los commits ya están en la rama principal. Solo incluirá sus confirmaciones recientes desde la reversión, pero lo que realmente queremos es reintroducir TODAS las confirmaciones que se han revertido, además de su nuevo trabajo. En otras palabras, nos gusta una forma de volver a emitir la Solicitud de extracción original.

Dado que Github no es compatible con esta característica (es decir, no se revierte una fusión, ni se deshace/vuelve a emitir una solicitud de extracción original), actualmente estoy revertiendo la fusión revertida. Esto se siente mal.

¿Qué otras formas podría usar para lograr el mismo objetivo en git? (o Github si es posible)

+1

Si ha intentado fusionar localmente las confirmaciones de la solicitud de extracción, y decidió después de la prueba que aún no desea realizar esa combinación, ¿por qué revierte la fusión, en lugar de simplemente restablecer el maestro antes de la fusión? ? (Supongo que no publica su rama principal después de fusionar una solicitud de extracción pero antes de decidir si la conserva o no). –

+0

Una vez que se acepta la solicitud de extracción, se fusiona automáticamente en principal, para que cualquiera en nuestro equipo pueda extraerla en cualquier momento. Al revertir, estaba siguiendo el consejo de la publicación de blog a la que hice referencia en mi pregunta, porque nos permitía pasar simplemente a otras solicitudes de extracción y minimizar los cuellos de botella en nuestro flujo de trabajo. Me preocupa que reiniciar empeoraría las cosas debido al hecho de que el maestro siempre está disponible para nuestros colaboradores de repositorio. –

+0

Ah, entonces aceptas la solicitud de extracción realmente en GitHub. (La función para pedirle a GitHub que realmente haga la fusión se agregó bastante recientemente.) En lugar de eso, buscaría las confirmaciones sugeridas en su repositorio local, las fusionaría y las probaría allí. Si está contento con eso, puede marcar la solicitud de extracción como aceptada en GitHub. –

Respuesta

1

Creo que su problema aquí surge porque cuando se trata de las solicitudes de extracción, elige fusionarlas automáticamente en GitHub. De las tres formas sugeridas de tratar con las solicitudes de extracción described in the documentation, está utilizando la última ("Combinación automática"), que fue solo recently implemented. Personalmente, creo que esto solo es apropiado para solicitudes de extracción triviales que obviamente son correctas. Para cualquier cosa más compleja, me gustaría utilizar el primer enfoque, es decir

  • añadiendo el repositorio del solicitante como un control remoto nuevo
  • captación desde dicho remota
  • tratar la fusión
  • prueba cuidadosamente
  • presionando el resultado si está contento

Eso significa que la versión combinada es solo pública una vez que la haya probado y haya decidido o empuje. Si no lo desea, puede restablecer su rama maestra a su posición anterior.


Como un asunto de interés, podría valer la pena decir más acerca de lo que sucede si hace final tener que volver una fusión lamentable, pero todavía quiere tener la opción de volver a fusionar una versión posterior de esa rama Aunque podría parecer un error, como yo lo entiendo, la manera más fácil de manejar esa situación es revertir la reversa. Puede encontrar más información sobre este tema en this post from the Pro Git blog y another discussion of the same problem de Linux Torvalds que también puede ser útil.

+0

Hola Mark: He leído esos últimos 2 artículos antes y aprecio que me lo recuerdes. Me encantaría implementar su sugerencia, excepto que ninguno de los miembros de la Organización tiene su propio fork en Github, simplemente lo clonan de nuestro repositorio, ya que nuestro jefe quería que cada desarrollador empujara su trabajo a las sucursales, solo para que tengamos una copia de su trabajo. Sin embargo, es posible que pueda configurar todos los "controles remotos" en una única máquina compartida y hacer que los presione para que podamos probar. El gran obstáculo será la automatización del proceso de implementación/revisión. Gracias por la visión! –

+0

@Chip Castle: no hay problema. De hecho, es aún más fácil si simplemente están presionando para incluir ramas: no necesita agregar un control remoto, simplemente haga 'git fetch origin' e intente fusionarse desde la rama de seguimiento remoto correcta. –

+0

Hmmm ... nuestro proceso actual requiere que una persona de control de calidad lo revise manualmente después de que pase nuestro CI. Necesito configurar a Jenkins para que "git pull --rebase Origin master" tenga la copia más reciente, luego verifique la rama de características y "git rebase -i" para asegurarse de que todo esté actualizado antes de ejecutar el banco de pruebas. Si eso pasa, podría hacer que se despliegue automáticamente en un servidor de prueba donde se revisan nuestras evaluaciones de control de calidad. Entonces, si todo eso pasa, podría aceptar la Solicitud de extracción, ya que esa es la única acción que se combinaría en el maestro. Eso podría ayudar mucho. Dime qué piensas sobre esto. ¡Gracias! –

0

Yo sugeriría que ustedes tomen un enfoque diferente. Tu flujo de trabajo de revertir y revertir revierte me parece muy confuso. El problema real que está tratando de resolver se puede abordar de manera diferente.

Le sugiero que cambie su flujo de trabajo para utilizar dos ramas. Una rama estable (master) y una rama de desarrollo (develop). Todo el trabajo entra en la rama develop, o en ramas de tema separadas. Las solicitudes de extracción siempre se archivan en la sucursal develop, luego se fusionan en develop cuando se aprueban.

master es inicialmente derivado de develop.Tan pronto como develop se encuentre en un estado estable, se fusiona en master. master es la versión estable actual.

Esto se basa libremente en nvie's "A successful Git branching model".

+0

He leído ese artículo antes y es un gran método para seguir con seguridad, pero no pareció funcionar bien para nuestro equipo. Ya utilizamos las ramas de características y las ejecuciones de CI una vez que se fusiona con la maestra (a través de una solicitud de extracción de Github), por lo que tener una rama de desarrollo, que probamos por un tiempo, fue simplemente más trabajo de administrar. Además, incluso con nuestro banco de pruebas, hubo ocasiones en que el maestro se volvió inestable, por lo que realmente no ayudó mucho a nuestro equipo. Sin embargo, lo tendré en cuenta en el futuro. Gracias de nuevo por su sugerencia. –

0

Si obtiene un regimiento de rama por función, puede reconstruir un candidato de lanzamiento con las características que desee. Usted no tendrá que "revertir una fusión":

lectura adicional: https://plus.google.com/109096274754593704906/posts/R4qkeyRadLR

Por favor ver los comentarios, así como para información adicional. Funciona realmente bien para nosotros.