lanzamiento del sistema distribuido de control de versiones . Git es uno de los sistemas de control de versiones más populares, confiables y de alto rendimiento, que ofrece herramientas flexibles para el desarrollo no lineal, basadas en la ramificación y la fusión de ramas. Para garantizar la integridad de la historia y la resistencia a cambios retrospectivos, se utiliza un hash implícito de toda la historia previa en cada commit, y también es posible verificar digitalmente las firmas de los desarrolladores de etiquetas y commits individuales.
En comparación con la versión anterior, se han realizado 745 cambios en esta nueva versión, con la participación de 74 desarrolladores, de los cuales 18 contribuyeron por primera vez al desarrollo. :
- Desde la versión 1.18, el nuevo modo de traslado de un conjunto de commits «git rebase —rebase-merges» ha reemplazado a la antigua opción «—preserve-merges», que ahora se ha marcado como obsoleta. La operación «git rebase» se utiliza para reemplazar una serie de commits por un nuevo commit base, por ejemplo, para mover una rama específica en la que se desarrolla una nueva funcionalidad al estado actual de la rama master, que incluye correcciones añadidas después de la ramificación:
o — o — o (my-feature)
/
o — o — o — o — o (master)
o — o — o (my-feature)
/
o — o — o — o — o (master)
Para mantener la estructura de ramificación en una rama trasladada, anteriormente se podía utilizar la opción «—preserve-merges», que al ejecutarse en modo interactivo (git rebase -i —preserve-merges) permitía editar la historia de commits, pero no garantizaba la conservación completa de la estructura del repositorio. El nuevo modo «—rebase-merges» permite conservar la estructura de cambios en la rama trasladada, proporcionando al mismo tiempo un conjunto completo de operaciones interactivas, incluyendo eliminación, reorganización y renombramiento de commits.
Por ejemplo, «—rebase-merges» volver a subir commits desde una rama separada a una rama master más nueva, manteniendo la estructura de ramificación en la rama trasladada y haciendo algunos cambios sobre la marcha en las notas de los commits.
- Se agregó soporte para crear una nueva rama basado en el resultado de la definición de la base de fusión de dos ramas (merge base, vinculación con un antecesor común) utilizando las construcciones «git branch new A…B» y «git checkout -b new A…B», donde «A…B» implica la definición de la base de fusión entre los dos commits especificados, de manera análoga a cómo «git checkout A…B» desplaza HEAD al commit base y «diff A…B» muestra los cambios entre el commit «B» y el antecesor común con el commit «A».
Por ejemplo, al trabajar en una rama separada my-feature, la función propuesta se puede utilizar cuando es necesario comenzar desde otra rama, por ejemplo, desde el mismo punto en la rama master desde donde se extrajo la rama my-feature. Anteriormente, esto requería investigar manualmente el registro de cambios, lo que resultaba incómodo al tener una larga historia de cambios, luego ejecutar «git merge-base master my-feature» para calcular el hash de la base de fusión entre las ramas master y my-feature y crear una nueva rama en relación con el antecesor común «git branch my-other-feature hash». En Git 2.22, para crear una rama en relación con la base de fusión de dos ramas, se puede utilizar la sintaxis «git branch my-other-feature A…B»;
- Se agregó la opción «git branch —show-current» para mostrar el nombre de la rama que se obtiene al realizar la operación checkout;
- Se agregó la opción «git checkout —no-overlay — dir», que permite al realizar la operación checkout hacer que el contenido del directorio dir refleje completamente el estado de la rama master. Por ejemplo, si en la copia local del directorio dir hay un archivo que falta en la rama master, por defecto al realizar «git checkout master — dir» este se dejará, y al especificar la opción «—no-overlay» se eliminará;
- En el comando «git diff» se utiliza una API universal para analizar opciones, lo que permite unificar el procesamiento de opciones con otras utilidades de git. Por ejemplo, en «git diff» ahora están disponibles para todas las opciones sus opuestos («—function-context» y «—no-function-context»);
- Se agregó la posibilidad de filtrar al mostrar «git log» etiquetas extendidas adjuntas a los commits («trailer» — banderas informativas adicionales, como Signed-off-by y Co-authored-by). Es posible filtrar las etiquetas tanto por clave como por valor, por ejemplo:
«git log —pretty=»%(trailers:key=Reviewed-by,valueonly)»; - Se ha añadido un nuevo mecanismo de seguimiento Trace2, que ofrece un formato de salida más flexible y estructurado. Trace2 permite recopilar telemetría sobre las operaciones realizadas y los datos de rendimiento para un análisis y depuración más detallados (el manejador es asignado por el usuario, no se envían datos al exterior);
- Se ha hecho más legible el informe "git bisect", en el que ahora se destacan de manera más visual los commits problemáticos y se muestra un resumen estadístico de los cambios para cada archivo (a nivel del número de líneas modificadas);
- Se ha reestructurado la heurística para la detección de renombramientos de directorios con el fin de excluir la configuración errónea de etiquetas de renombrado. En caso de dudas, esos directorios ahora se marcan como conflictivos;
- Se ha proporcionado una advertencia cuando se intenta establecer una etiqueta sobre otra etiqueta, lo cual suele ocurrir por error y puede llevar a etiquetar el commit incorrecto (por ejemplo, una construcción como "git tag -f -m 'mensaje actualizado' my-tag1 my-tag2" creará una etiqueta sobre la etiqueta antigua, mientras que el desarrollador esperaba que la nueva etiqueta se colocara en el commit apuntado por la etiqueta antigua);
- Se ha incluido la generación de mapas de bits para repositorios (estructura de disco "reachability bitmaps"), que almacenan datos sobre conjuntos de objetos disponibles para cada commit y permiten determinar rápidamente la existencia de un objeto base. Esta estructura reduce significativamente el tiempo de ejecución de las operaciones de recuperación de datos (git fetch).
Fuente: opennet.ru
