Nueva característica en Git 3: cierres

Git es un popular sistema de control de versiones. En Git, un cambio atómico de uno o varios archivos se denomina confirmación, y varias confirmaciones consecutivas se combinan en una rama. Las ramas se utilizan para implementar nuevas ideas (características).



Sucede que la idea es un callejón sin salida y el desarrollador se ha equivocado, por lo que debe volver a la versión original. Debería olvidarse de la nueva rama, cambiar a la rama principal o principal y continuar trabajando. En este caso, el "vástago" se colgará para siempre, así como el deseo de eliminarlo. Pero, ¿cómo eliminar la parte de la historia? Esta rama muestra los esfuerzos del programador trabajador, incluso en vano. Por lo tanto, será más fácil informar al jefe, ¡porque un resultado fallido también es un resultado!


Me apresuro a alegrarme de que los desarrolladores de Git vayan a introducir un nuevo comando para cerrar tales ramas "sin hogar" en la tercera versión. La versión actual es 2.21.0 .


¿Cómo utilizar este comando, qué beneficios ofrece y qué piensan las empresas de TI? El artículo responde a estas y otras preguntas.


Descripción


Ahora es posible cerrar una rama fallida sobre una de las confirmaciones anteriores. Los arcos de cierre son de color amarillo en las imágenes a continuación.




El commit 4 es el último para la función fallida. Se cerró sobre el commit 1 , y luego volvemos al master y vamos por el otro lado (el commit 5 ).


También puede cerrar un commit sobre sí mismo, creando así bucles :




Puede cerrar la rama sobre cualquier confirmación: Git es inteligente, calcula las diferencias y combina todo correctamente:




¿Cómo usarlo?


El comando merge no incluye la funcionalidad de los cierres, ya que para el primer caso, la bifurcación se reenviará rápidamente , y para el segundo caso no se hará nada ( git already up to date ).


Para no cambiar el comportamiento anterior, los desarrolladores decidieron introducir un comando de cierre:


 git closure -s $source_commit -d $dest_commit -m $message 

El primer argumento -s $source_commit establece el hash del commit desde el que desea estirar el ciclo, y el segundo (opcional) -d $dest_commit establece el commit en el que se cerrará el ciclo. Si está ausente, el cierre se produce en la rama de salida actual. El argumento -m $message establece un mensaje de cierre, como la failed feature, revert to origin . Sin embargo, la --allow-empty-message también está disponible, lo que permite confirmaciones sin mensajes. Por defecto, Git permite solo un cierre para un par de confirmaciones. Para evitar esta limitación, la --allow-multiple-closures está disponible.



Después de ejecutar el comando, Git calcula los cambios y, en la confirmación final, se mostrará una doble diferencia: desde la base y las ramas de cierre. En el caso general, es una diferencia n-dimensional, es decir, puede haber tantos cierres como desee. cierre-confirmación es similar a fusión-confirmación con la única diferencia de que contiene varios mensajes, no uno.


Desafortunadamente, las GUI de Git existentes no tienen un buen soporte de cierres. La versión de vista previa de GitExtensions muestra curvas de fusión en lugar de arcos elegantes. Eche un vistazo a los nuevos campos como Closure message Closure diff y Closure diff :



Vale la pena señalar que el comando de closure siempre cambia el historial (¡ya que ahora Git es una máquina del tiempo completa!), Por lo tanto, ahora es posible empujar ramas solo con la opción --force , o la opción segura --force-with-lease Opción de --force-with-lease .


Rebase también está disponible para ramas en bucle, aunque la lógica para recalcular confirmaciones es complicada.


Además, la opción automática permite el cierre automático de todas las sucursales antiguas. En este caso, la confirmación de cierre es la que inicia la rama. Con los complementos Git IDE, los cierres se pueden ejecutar periódicamente. En GitExtensions hay un complemento similar Eliminar ramas obsoletas .


Lo que piensan las empresas de TI


Las grandes empresas de TI: Google, Facebook, Apple, DeepMind, Positive Technologies, y especialmente Microsoft, están esperando ansiosamente el cierre, porque ahora será posible formalizar el ciclo de vida de las sucursales, incluidas las no fusionadas.


Uno de los principales gerentes de Microsoft, Michael Richter, escribió :


La nueva característica de Git, por supuesto, reducirá el caos en el mundo del desarrollo de código abierto (y no solo). Hay muchas ramas "colgantes" en nuestros repositorios. Por ejemplo, en vscode tenemos más de 200 y en TypeScript más de 300. Y este problema no es solo nuestro. Los cierres no solo mejoran la organización, sino que también permiten rastrear el razonamiento del programador, a veces completamente incomprensible incluso para los colegas :) Los cierres me recordaron la película "Regreso al futuro", donde los personajes viajaron al pasado y al futuro. Me gusta esta película, la vi varias veces. Y creo que amaré a Git aún más porque si esta característica :)

Nota


Si anteriormente el gráfico de commits era un gráfico acíclico dirigido (DAG), entonces los cierres lo extienden a un gráfico dirigido general. Usando Git, puede describir expresiones regulares en las que los estados son confirmaciones, y el alfabeto es el conjunto de todos los mensajes. Pero este es el tema del centro "Programación anormal" y, por lo tanto, va más allá del alcance de este artículo. Sin embargo, si esto le parece interesante, consulte el artículo sobre cómo almacenar árboles genealógicos dentro de Git.

Source: https://habr.com/ru/post/445680/


All Articles