¿Por qué git fast-forward se fusiona de forma pnetworkingeterminada?

Viniendo de mercurial, uso twigs para organizar las funciones. Naturalmente, quiero ver este flujo de trabajo en mi historia también.

Comencé mi nuevo proyecto usando git y terminé mi primera function. Al fusionar la function, me di count de que git utiliza el avance rápido, es decir, aplica mis cambios directamente a la twig principal si es posible y se olvida de mi twig.

Entonces, pensar en el futuro: soy el único que trabaja en este proyecto. Si utilizo el enfoque pnetworkingeterminado de git (fusión de avance rápido), mi historial daría como resultado una twig principal gigante. Nadie sabe que utilicé una sucursal por separado para cada function, porque al final solo tendré esa twig maestra gigante. ¿No se verá eso poco profesional?

Con este razonamiento, no quiero una fusión rápida y no puedo ver por qué es la pnetworkingeterminada. ¿Qué tiene de bueno esto?

La fusión rápida tiene sentido para las sucursales efímeras, pero en una historia más compleja , la fusión no rápida puede facilitar la comprensión de la historia y facilitar la reversión de un grupo de confirmaciones.

Advertencia : el reenvío rápido también tiene posibles efectos secundarios. Revise https://sandofsky.com/blog/git-workflow.html , evite el 'no-ff' con sus "compromisos de punto de control" que rompan la culpa o la bisectriz, y considere cuidadosamente si debe ser su enfoque pnetworkingeterminado para el master .

texto alternativo
(De nvie.com , Vincent Driessen , publica " Un exitoso model de ramificación de Git ")

Incorporando una característica terminada en desarrollar

Las funciones finalizadas se pueden fusionar en la twig de desarrollo para agregarlas a la próxima versión:

 $ git checkout develop Switched to branch 'develop' $ git merge --no-ff myfeature Updating ea1b82a..05e9557 (Summary of changes) $ git branch -d myfeature Deleted branch myfeature (was 05e9557). $ git push origin develop 

El --no-ff hace que la fusión siempre cree un nuevo object de confirmación, incluso si la combinación se puede realizar con un avance rápido. Esto evita perder información sobre la existencia histórica de una twig de características y agrupa todas las confirmaciones que juntas agregaron la característica.

Jakub Narębski también menciona la configuration merge.ff :

De forma pnetworkingeterminada, Git no crea una confirmación de fusión adicional cuando se fusiona una confirmación que es un descendiente de la confirmación actual. En cambio, la punta de la twig actual se reenvía rápidamente.
Cuando se establece en false , esta variable le dice a Git que cree un compromiso de fusión adicional en ese caso (equivalente a dar la --no-ff desde la línea de command).
Cuando se establece en ' only ', solo se permiten las fusiones de avance rápido (equivalentes a dar la opción --ff-only desde la línea de command).


El avance rápido es el valor pnetworkingeterminado porque:

  • las twigs efímeras son muy fáciles de crear y usar en Git
  • Las twigs efímeras a menudo aíslan muchos commits que se pueden reorganizar libremente dentro de esa twig
  • esos commits son en realidad parte de la twig principal: una vez reorganizada, la twig principal se reenvía rápidamente para includelos.

Pero si anticipa un flujo de trabajo iterativo en una twig tema / característica (es decir, me fusiono, luego vuelvo a esta twig de características y agrego algunas confirmaciones más), entonces es útil include solo la fusión en la twig principal, en lugar de todas las confirmaciones intermedias de la twig de características.

En este caso, puede terminar configurando este tipo de file de configuration :

 [branch "master"] # This is the list of cmdline options that should be added to git-merge # when I merge commits into the master branch. # The option --no-commit instructs git not to commit the merge # by default. This allows me to do some final adjustment to the commit log # message before it gets commited. I often use this to add extra info to # the merge message or rewrite my local branch names in the commit message # to branch names that are more understandable to the casual reader of the git log. # Option --no-ff instructs git to always record a merge commit, even if # the branch being merged into can be fast-forwarded. This is often the # case when you create a short-lived topic branch which tracks master, do # some changes on the topic branch and then merge the changes into the # master which remained unchanged while you were doing your work on the # topic branch. In this case the master branch can be fast-forwarded (that # is the tip of the master branch can be updated to point to the tip of # the topic branch) and this is what git does by default. With --no-ff # option set, git creates a real merge commit which records the fact that # another branch was merged. I find this easier to understand and read in # the log. mergeoptions = --no-commit --no-ff 

El OP agrega en los comentarios:

Veo algo de sentido en el avance rápido para las twigs [efímeras], pero convertirla en la acción pnetworkingeterminada significa que git supone que … a menudo tienen twigs [efímeras]. ¿Razonable?

Jefromi responde:

Creo que la vida útil de las sucursales varía mucho de un usuario a otro. Entre los usuarios experimentados, sin embargo, es probable que haya una tendencia a tener twigs mucho más efímeras.

Para mí, una twig de vida corta es una que creo para hacer que una determinada operación sea más fácil (reajustes, probables o rápidos parches y testings), y luego eliminar inmediatamente una vez que haya terminado.
Eso significa que probablemente debería ser absorbido en la twig de tema desde la cual se bifurcó , y la twig de tema se fusionará como una sola twig. Nadie necesita saber lo que hice internamente para crear la serie de compromisos que implementan esa característica.

De manera más general, agrego:

realmente depende de tu flujo de trabajo de desarrollo :

  • si es lineal, una twig tiene sentido.
  • Si necesita aislar características y trabajar en ellas durante un largo período de time y fusionarlas varias veces, varias twigs tienen sentido.

Consulte "¿ Cuándo debería sucursal? "

En realidad, cuando se considera el model de la twig Mercurial, está en su núcleo una twig por repository (aunque se pueden crear encabezados anónimos, marcadores e incluso twigs con nombre )
Ver "Git y Mercurial – Comparar y Contraste" .

Mercurial, de forma pnetworkingeterminada, utiliza líneas de código ligeras anónimas, que en su terminología se denominan "cabezas".
Git usa twigs ligeras con nombre, con mapeo inyectivo para mapear los nombres de las twigs en el repository remoto a los nombres de las twigs de seguimiento remoto.
Git lo "obliga" a nombrar sucursales (bueno, con la exception de una única twig sin nombre, que es una situación llamada " HEAD desconectado "), pero creo que esto funciona mejor con flujos de trabajo de twig de tree, como flujo de trabajo de twig de tema, lo que significa múltiples twigs en un paradigma de repository único.

Permítanme ampliar un poco sobre la respuesta muy completa de VonC :


En primer lugar, si recuerdo correctamente, el hecho de que Git por defecto no cree confusiones de fusión en el caso de avance rápido proviene de considerar "repositorys iguales" de una sola twig, donde la extracción mutua se utiliza para sincronizar esos dos repositorys (un flujo de trabajo que puede encontrar como primer ejemplo en la mayoría de la documentation del usuario, incluido "Manual de usuario de Git" y "Control de versiones por ejemplo"). En este caso, no usa la function de extracción para fusionar la twig completamente realizada, la usa para mantenerse al día con otros trabajos. No querrás tener un hecho efímero y sin importancia cuando guardes una synchronization guardada y almacenada en el repository, guardada para el futuro.

Tenga en count que la utilidad de las twigs de características y de tener múltiples twigs en un solo repository vino más tarde, con un uso más generalizado de VCS con un buen soporte de fusión, y con la testing de diversos flujos de trabajo basados ​​en fusiones. Es por eso que, por ejemplo, Mercurial originalmente solo admitía una sucursal por depósito (más consejos anónimos para rastrear sucursales remotas), como se vio en revisiones anteriores de "Mercurial: The Definitive Guide".


En segundo lugar, cuando se siguen las mejores prácticas de uso de twigs de características , es decir, que las twigs de características deben comenzar desde una versión estable (por lo general, desde la última versión), para poder elegir y seleccionar qué características include seleccionando qué entidad se fusionará, usted generalmente no están en una situación de avance rápido … lo que hace que este tema sea discutible. Debe preocuparse por crear una combinación real y no avanzar cuando se fusiona una primera twig (suponiendo que no se realicen cambios de compromiso único directamente en 'master'); todas las otras fusiones posteriores son, por supuesto, en una situación no rápida.

HTH