Cómo evitar el infierno de fusión y confirmación en GitHub / BitBucket

101

Terminamos con muchas confirmaciones como esta en nuestro repositorio:

Merge branch 'master' of bitbucket.org:user/repo

Esto sucede cada vez que un desarrollador sincroniza su bifurcación local con el repositorio de nivel superior.

¿Hay alguna forma de evitar que este infierno de combinación y compromiso abarrote todo el registro de repositorios? ¿Se pueden evitar al iniciar las solicitudes de extracción de alguna manera?

Sé que puedo hacer git rebase si esto se hace solo en mi VM local, ¿hay alguna equivalencia en la interfaz de usuario de GitHub / BitBucket?

¿Como lo hacen ustedes?

Niklas9
fuente

Respuestas:

136

Rebasear ramas de entidades antes de fusionar

Si desea evitar las confirmaciones de fusión, debe asegurarse de que todas las confirmaciones avancen rápidamente. Para hacer esto, asegúrese de que su rama de características se base de manera limpia en su línea de desarrollo antes de una fusión como esta:

git checkout master
git checkout -b feature/foo

# make some commits

git rebase master
git checkout master
git merge --ff-only feature/foo

Rebase también tiene muchos indicadores, incluido el rebase interactivo con el -iindicador, pero es posible que no lo necesite si mantiene las cosas lo más simples posible y desea conservar todo el historial de su rama en una combinación.

Usa la --ff-onlybandera

Además de rebasar, el uso de la --ff-onlybandera asegurará que solo se permitan confirmaciones de avance rápido. No se realizará una confirmación si fuera una confirmación de fusión en su lugar. La página de manual de git-merge (1) dice:

--ff-only

Rechace fusionarse y salir con un estado distinto de cero a menos que el HEAD actual ya esté actualizado o la fusión se pueda resolver como un avance rápido.

Todd A. Jacobs
fuente
1
Esta es una respuesta genial. Utilizo rebase tan a menudo como puedo. Sin embargo, no sabía sobre la bandera --ff-only. ¡Muy genial!
Leo Correa
3
Gracias por los consejos de rebase y --ff-only. Sin embargo, como dije en mi pregunta, ¿cómo puedo hacer esto dentro de la interfaz de usuario de GitHub / BitBucket?
Niklas9
3
@Niklas Estoy bastante seguro de que necesitarás recurrir a la CLI para hacer lo que quieras. GitHub no expone todo el poder de Git; sólo un subconjunto de sus características más algunos valores agregados gráficos y de redes sociales. ¡Buena suerte!
Todd A. Jacobs
3
Una cosa a tener en cuenta con este proceso es que, antes de fusionar la rama del tema (feature / foo) de nuevo en la maestra, será mejor que git pull origin master (si usa un control remoto), para asegurarse de que la rama maestra esté actualizada . Si se encontraron actualizaciones, asegúrese de volver a convertir el maestro en la rama del tema antes de fusionarlo nuevamente en el maestro.
chikamichi
19
@CodeGnome no lo llame "recurrir" a la CLI ... ¡en realidad debería advertir sobre "recurrir" a la interfaz de usuario!
Droogans
9

"Todd A. Jacobs" ya mencionado "rebase" es el concepto aquí. Esta es solo una forma más detallada de hacer las cosas.

Digamos que estás en la rama maestra

$ git branch
  * master

Quiere hacer una corrección, así que cree una "rama de reparación" que se ramifique desde el maestro

$ git checkout -b fixbranch

Tal vez hubiera trabajado durante un par de días en esta rama y hubiera tenido un par de confirmaciones.

¡El día que quisiste enviar tus confirmaciones al repositorio principal central! Realice el pago del maestro y obtenga los últimos cambios del repositorio maestro central

$ git checkout master
$ git pull origin master

Vuelva a basar su fixbranch con el maestro para tener un historial limpio y resolver los conflictos, si los hay, en el repositorio local.

$ git checkout fixbranch
$ git rebase master

Ahora fixbranch está actualizado con el maestro central, permítanme fusionar fixbranch en la rama maestra

 $ git checkout master
 $ git merge fixbranch

¡He terminado! déjame empujar el maestro local al maestro central

$ git push origin master

https://git-scm.com/book/en/v2/Git-Branching-Rebasing

Kondal Kolipaka
fuente
Agradezco esta respuesta.
lasec0203