Git avance rápido VS sin fusión de avance rápido

247

La fusión de Git nos permite realizar un avance rápido y no una fusión de rama de avance rápido rápido. ¿Alguna idea de cuándo utilizar la combinación de avance rápido y cuándo no utilizar la combinación de avance rápido?

Chau Chee Yang
fuente
2
Creo que se puede encontrar otra muy buena perspectiva aquí endoflineblog.com/gitflow-considered-harmful
Dmitry Minkovsky
¿La misma pregunta? stackoverflow.com/questions/9069061
Yousha Aleayoub

Respuestas:

290

La --no-ffopción es útil cuando desea tener una idea clara de la rama de su característica. Por lo tanto, incluso si no se realizaron confirmaciones, FF es posible; a veces aún desea que cada confirmación en la línea principal corresponda a una característica. Por lo tanto, trata una rama de características con un montón de confirmaciones como una sola unidad y las combina como una sola unidad. Está claro en su historial cuándo se fusionan las ramas de características --no-ff.

Si no le importa tal cosa, probablemente podría salirse con la suya siempre que sea posible. Por lo tanto, tendrá más sensación de flujo de trabajo similar a la svn.

Por ejemplo, el autor de este artículo piensa que esa --no-ffopción debería ser predeterminada y su razonamiento es similar al que describí anteriormente:

Considere la situación en la que una serie de confirmaciones menores en la rama "característica" forman colectivamente una nueva característica: si solo hace "git merge feature_branch" sin --no-ff", es imposible ver en el historial de Git cuáles de los objetos de confirmación juntos tienen implementado una función: tendría que leer manualmente todos los mensajes de registro. Revertir una función completa (es decir, un grupo de confirmaciones) es un verdadero dolor de cabeza [si --no-ffno se usa], mientras que se hace fácilmente si --no-ffse utilizó la bandera [porque es solo una confirmación] ".

Gráfico que muestra cómo --no-ff agrupa todas las confirmaciones de la rama de características en una confirmación en la rama maestra

Ivan Danilov
fuente
3
Y los avances rápidos son geniales para cuando tienes una colección de ramas estrechamente relacionadas que de vez en cuando quieres mover juntas. No todas las fusiones son eventos de la historia real.
Cascabel
3
¿Por qué mantener varias ramas entonces? Si están estrechamente relacionados, ¿por qué no hacer todo en una sola rama?
Ivan Danilov
11
Estrechamente relacionado no significa idéntico. Además, el flujo de trabajo no siempre es bueno. No siempre haces los compromisos que crees que vas a hacer, no siempre ramificas desde el mejor lugar. Tal vez comience un par de funciones desde un lugar, comience a trabajar en una de ellas, se dé cuenta de que es genérico y avance rápidamente la otra antes de divergir.
Cascabel
2
En cuanto a la primera respuesta, entiendo que OP quiere saber las mejores prácticas a seguir. Las cosas suceden y no todo es ideal, pero esto parece más un compromiso forzado.
Ivan Danilov
1
Vale la pena señalar que los beneficios de --no-ffsu historial de confirmación pueden no ser inmediatamente evidentes cuando se utilizan herramientas básicas como git log, que continuará mostrando todas las confirmaciones de todas las ramas que se han fusionado en su rama actual. Dicho esto, los beneficios se vuelven más claros cuando se usa, por ejemplo, git log --first-parenten una rama de integración como developo master. Si usa religiosamente --no-ff, eso mostrará exclusivamente solicitudes de fusión, mientras git logque aún proporcionará un (más) historial completo. Es por eso que Vincent lo recomienda para usar con GitFlow .
Jeremy Caney
12

Puedo dar un ejemplo comúnmente visto en el proyecto.

Aquí, la opción --no-ff(es decir, fusión real ) crea una nueva confirmación con varios padres y proporciona un mejor seguimiento del historial. De lo contrario, --ff(es decir , combinación de avance rápido ) es por defecto.

$ git checkout master
$ git checkout -b newFeature
$ ...
$ git commit -m 'work from day 1'
$ ...
$ git commit -m 'work from day 2'
$ ...
$ git commit -m 'finish the feature'
$ git checkout master
$ git merge --no-ff newFeature -m 'add new feature'
$ git log
// something like below
commit 'add new feature'         // => commit created at merge with proper message
commit 'finish the feature'
commit 'work from day 2'
commit 'work from day 1'
$ gitk                           // => see details with graph

$ git checkout -b anotherFeature        // => create a new branch (*)
$ ...
$ git commit -m 'work from day 3'
$ ...
$ git commit -m 'work from day 4'
$ ...
$ git commit -m 'finish another feature'
$ git checkout master
$ git merge anotherFeature       // --ff is by default, message will be ignored
$ git log
// something like below
commit 'work from day 4'
commit 'work from day 3'
commit 'add new feature'
commit 'finish the feature'
commit ...
$ gitk                           // => see details with graph

(*) Tenga en cuenta que aquí si la newFeaturerama se reutiliza, en lugar de crear una nueva rama, git tendrá que --no-fffusionarse de todos modos. Esto significa que la combinación de avance rápido no siempre es elegible.

campo temático
fuente
6

Cuando trabajamos en un entorno de desarrollo y fusionamos nuestro código con la rama de preparación / producción, Git no fast forward puede ser una mejor opción. Por lo general, cuando trabajamos en la rama de desarrollo para una característica única, tendemos a tener múltiples confirmaciones. El seguimiento de los cambios con múltiples confirmaciones puede ser inconveniente más adelante. Si nos fusionamos con la rama de puesta en escena / producción usando Git sin avance rápido, entonces solo tendrá 1 confirmación. Ahora, cada vez que queramos revertir la función, simplemente revierta esa confirmación. La vida es fácil.

Pritom Nandy
fuente
0

También es posible que uno desee tener ramas de características personalizadas donde el código se coloca al final del día. Eso permite rastrear el desarrollo con mayor detalle.

No me gustaría contaminar el desarrollo maestro con código que no funciona, por lo que hacer --no-ff puede ser lo que uno está buscando.

Como nota al margen, puede que no sea necesario confirmar el código de trabajo en una rama personalizada, ya que el historial puede reescribirse git rebase -iy forzarse en el servidor siempre que nadie más esté trabajando en esa misma rama.

g24l
fuente