Control de versiones
Un sistema de control de versiones (VCS, Version Control System) es una herramienta que registra los cambios realizados sobre uno o varios ficheros a lo largo del tiempo, de modo que pueda recuperarse cualquier estado anterior, compararse revisiones y coordinarse el trabajo de varios desarrolladores sobre la misma base de código. Son herramientas específicas de control de versiones de software: Git, Mercurial y Apache Subversion (SVN), a las que se suman los sistemas históricos CVS (Concurrent Versions System) y Microsoft Visual SourceSafe (VSS).
Conviene no confundir el sistema de control de versiones con la plataforma de alojamiento colaborativo que lo aloja. GitHub, GitLab, Bitbucket o Azure DevOps Server son servicios/plataformas construidos sobre un VCS (normalmente Git), pero Bitbucket no es en sí mismo un sistema de control de versiones, sino una plataforma de Atlassian que aloja repositorios Git y que permite la integración con la herramienta JIRA. Tampoco es un VCS JMeter, que es una herramienta de pruebas de carga y rendimiento de Apache.
Modelos: centralizado frente a distribuido
-
Centralizado (CVS, Subversion, VSS): existe un único repositorio central con el que cada desarrollador trabaja directamente; el historial reside en el servidor y suele necesitarse conexión para operar.
-
Distribuido (Git, Mercurial): cada desarrollador dispone de una copia local completa del repositorio, con todo el historial. Por ello, es INCORRECTO afirmar que "en el modelo distribuido cada desarrollador trabaja directamente con el repositorio central": precisamente lo característico del modelo distribuido es que el trabajo se realiza contra el repositorio local, y solo se sincroniza con el remoto cuando se desea.
Git
Git es un sistema de control de versiones de código libre y arquitectura distribuida, creado por Linus Torvalds. Al ser distribuido, no es necesario tener conexión a internet para realizar confirmaciones (commits): los commits se registran en el repositorio local. En Git, hacer un commit es la acción de almacenar una nueva instantánea (snapshot) del estado del proyecto en el historial de Git.
Comandos esenciales de Git
| Comando | Función |
|---|---|
git init | Crea/inicializa un nuevo repositorio local |
git clone /path/to/repository | Crea una copia de trabajo de un repositorio (local o remoto) ya existente |
git branch | Crea/lista/gestiona ramas del repositorio |
git tag | Lista o crea etiquetas (marcas de versiones/releases) |
git diff | Muestra los cambios y genera estadísticas de diferencias entre rutas, archivos o commits |
git commit | Registra una instantánea del estado del proyecto |
git pull origin nombre_branch | Actualiza el contenido de una rama desde el remoto para trabajar en ella |
git push origin master | Sube los commits de la rama local master al remoto origin |
El fichero .gitignore especifica qué archivos NO deben ser rastreados (ignorados) por el control de versiones. No es un comando, sino un fichero de configuración por directorio.
Apache Subversion (SVN)
Subversion es un sistema de control de versiones centralizado. Para indicar los ficheros que NO deben ser tenidos en cuenta por el control de versiones se emplea la propiedad svn:ignore, establecida con svn propset sobre un directorio versionado; para consultarla se usa svn propget svn:ignore. La propiedad contiene patrones de nombre de fichero separados por saltos de línea y aplica solo al directorio en el que se define, no a sus subdirectorios.
CVS (Concurrent Versions System)
CVS es un VCS centralizado clásico. Comandos relevantes:
-
annotate: si se necesita verificar la revisión en que fue modificada cada línea de un archivo, se utiliza el comandoannotate(muestra, línea a línea, la última revisión que la modificó y su autor). -
cvs add -kb miFichero: la opción de expansión de palabras clave-kbmarca el fichero como binario; al ejecutarlo se está añadiendo un fichero como binario, evitando la conversión de fines de línea entre plataformas y la sustitución de palabras clave.
Mercurial
Mercurial es un sistema de control de versiones distribuido y multiplataforma, orientado a desarrolladores de software, cuyo cliente de línea de órdenes es hg. El comando outgoing (hg outgoing) permite comprobar qué conjuntos de cambios (changesets) se subirían al repositorio de destino si se ejecutara un push; muestra los cambios locales aún no presentes en el remoto, sin llegar a enviarlos.
Herramientas de Microsoft
-
Microsoft Visual SourceSafe (VSS) es una herramienta de control de versiones de Microsoft (hoy descatalogada), de modelo centralizado.
-
Azure DevOps Server (antes Team Foundation Server, TFS) es la plataforma de control de versiones de Microsoft actual, que soporta tanto repositorios Git como el control centralizado TFVC, además de gestión de proyectos y CI/CD.
Cuadro resumen de identificación
| Nombre | ¿Es un VCS? | Modelo | Notas |
|---|---|---|---|
| Git | Sí | Distribuido | Libre; commits offline |
| Mercurial | Sí | Distribuido | Multiplataforma; hg |
| Apache Subversion (SVN) | Sí | Centralizado | svn:ignore |
| CVS | Sí | Centralizado | annotate, -kb |
| Visual SourceSafe (VSS) | Sí | Centralizado | Microsoft (obsoleto) |
| GitHub / GitLab | Plataforma sobre Git | — | Alojamiento colaborativo |
| Bitbucket | Plataforma (no VCS) | — | Atlassian; integra JIRA |
| Azure DevOps Server | Plataforma (Microsoft) | — | Git + TFVC |
| JMeter | No (pruebas de carga) | — | Apache |
Fuentes
-
Git — Documentación oficial (git-scm.com): https://git-scm.com/docs (git-init, git-clone, git-branch, git-tag, git-diff, git-commit, git-push, gitignore)
-
Git Reference / gitignore: https://git-scm.com/docs/gitignore
-
Apache Subversion — Version Control with Subversion, "Ignoring Unversioned Items" (svn:ignore, propget/propset): https://svnbook.red-bean.com/en/1.7/svn.advanced.props.special.ignore.html
-
Mercurial SCM — Command reference
hg outgoing: https://www.mercurial-scm.org/ -
CVS — Concurrent Versions System, "Handling binary files" y "Keyword substitution" (-kb, annotate): https://www.gnu.org/software/trans-coord/manual/cvs/html_node/Binary-howto.html
-
Atlassian Bitbucket / integración con Jira: https://www.atlassian.com/software/bitbucket
-
Microsoft Learn — Azure DevOps Server: https://learn.microsoft.com/azure/devops/
Repositorios: estructura y actualización
Los programas para control de versiones (Git, Mercurial, Subversion, CVS…) guardan el historial en un repositorio. El desarrollador no trabaja directamente sobre él, sino sobre una copia de trabajo (working copy): un árbol de directorios corriente en su equipo, que es su espacio de trabajo privado.
Estructura de un repositorio Subversion: trunk, branches y tags
Subversion no impone ninguna organización de los datos, así que su documentación oficial recomienda una convención de estructura. Cada proyecto tiene una raíz de proyecto en el repositorio, y dentro de ella tres subdirectorios:
| Directorio | Contiene |
|---|---|
trunk | La línea principal de desarrollo |
branches | Las ramas: copias divergentes de líneas de desarrollo |
tags | Las etiquetas: instantáneas estables y con nombre de una línea de desarrollo |
Si el repositorio aloja un solo proyecto, su raíz puede hacer de raíz de proyecto. Si aloja varios, cada uno tiene su propia raíz con su trunk, branches y tags.
Estructura de un proyecto Git: las tres secciones
Un proyecto Git tiene tres secciones principales:
-
El directorio de Git (Git directory), donde se almacenan los metadatos y la base de datos de objetos del proyecto. Es lo que se copia al clonar un repositorio.
-
El directorio de trabajo (working directory): una copia de una versión del proyecto, extraída de esa base de datos para usarla o modificarla.
-
El área de preparación (staging area), también llamada índice (index). Es un archivo que guarda qué irá en la próxima confirmación.
De ahí salen los tres estados de un archivo en Git:
-
Modificado (modified): ha cambiado desde que se obtuvo del repositorio y no se ha preparado.
-
Preparado (staged): se ha añadido al área de preparación para la próxima confirmación.
-
Confirmado (committed): está almacenado de forma segura en la base de datos local.
Actualización: el ciclo de trabajo típico
El libro oficial de Subversion describe así el ciclo de trabajo diario:
-
Actualizar la copia de trabajo con
svn update. -
Hacer los cambios: editar ficheros. Los cambios de estructura se hacen con
svn add,svn delete,svn copyysvn move. -
Revisar los cambios con
svn statusysvn diff. -
Corregir los errores:
svn revertdevuelve un fichero o directorio a su estado sin modificar. -
Resolver los conflictos, es decir, integrar los cambios que otros publicaron mientras tanto. Se hace de nuevo con
svn update; si quedan conflictos locales, se resuelven consvn resolve. -
Publicar (confirmar) los cambios con
svn commit, que los envía al repositorio. Si se aceptan, crean las versiones más recientes.
Al ejecutar svn update, Subversion muestra junto a cada elemento un código de una letra que indica qué acción ha hecho para poner al día la copia de trabajo.
En Git, el equivalente es traer los cambios del remoto (git pull) y, en local, preparar los archivos (añadirlos al área de preparación) y confirmarlos (git commit). Confirmar toma los archivos tal como están en el área de preparación y guarda esa instantánea de forma permanente en el directorio de Git.
Fuentes de la estructura y actualización
-
Version Control with Subversion (libro oficial de Apache Subversion, 1.7), «Recommended Repository Layout» y «Basic Work Cycle»: https://svnbook.red-bean.com/en/1.7/svn.tour.importing.html y https://svnbook.red-bean.com/en/1.7/svn.tour.cycle.html
-
Pro Git (git-scm.com, edición en español), «Fundamentos de Git — Los Tres Estados»: https://git-scm.com/book/es/v2/Inicio---Sobre-el-Control-de-Versiones-Fundamentos-de-Git
Gestión de la configuración
La gestión de la configuración (configuration management, CM) es, según la norma IEEE 828-2012, la disciplina que aplica dirección y vigilancia técnica y administrativa para identificar y documentar las características funcionales y físicas de un elemento de configuración, controlar los cambios de esas características, registrar e informar del tratamiento de los cambios y del estado de su implantación, y verificar el cumplimiento de los requisitos especificados. La misma norma la resume como las actividades técnicas y organizativas de identificación, control, contabilidad de estado y auditoría de la configuración. Aplicada al software a lo largo de todo su ciclo de vida, para ayudar a asegurar la completitud y la corrección de sus elementos de configuración, se denomina gestión de la configuración del software (SCM, software configuration management) (ISO/IEC/IEEE 24765).
El control de versiones descrito en este artículo es una de sus herramientas: la norma ISO/IEC/IEEE 26511 define el control de versiones como el establecimiento y mantenimiento de líneas base y la identificación y control de los cambios sobre ellas, de modo que sea posible volver a la línea base anterior.
Conceptos básicos
-
Elemento de configuración (configuration item, CI): elemento o agregación de hardware, de software o de ambos que se designa para la gestión de la configuración y se trata como una sola entidad en ese proceso (ISO/IEC/IEEE 15288). IEEE 828-2012 lo define como la agregación de productos de trabajo designada para la gestión de la configuración y tratada como una sola entidad. No solo el código fuente: también la documentación, las estructuras de datos o los scripts pueden ser componentes de un elemento de configuración (ISO/IEC 16350).
-
Línea base (baseline): versión formalmente aprobada de un elemento de configuración, con independencia de su soporte, designada y fijada formalmente en un momento concreto de su ciclo de vida (ISO/IEC/IEEE 12207 y 15288). A partir de ella, los cambios requieren justificación y aprobación (IEEE 1012). Una línea base junto con todos los cambios aprobados sobre ella representa la configuración aprobada vigente.
-
Versión: instancia identificada de un elemento de configuración (ISO/IEC TR 18018).
-
Comité de control de la configuración (Configuration Control Board, CCB), también llamado comité de control de cambios: grupo de personas responsable de evaluar y aprobar o rechazar los cambios propuestos a los elementos de configuración, y de asegurar la implantación de los cambios aprobados (IEEE 828-2012).
Las cuatro actividades
| Actividad | En qué consiste |
|---|---|
| Identificación de la configuración | Seleccionar los elementos de configuración de un sistema y registrar sus características funcionales y físicas en la documentación técnica (ISO/IEC/IEEE 24765). |
| Control de la configuración | Evaluar, coordinar, aprobar o rechazar e implantar los cambios a los elementos de configuración una vez establecida formalmente su identificación (ISO/IEC/IEEE 24765). |
| Contabilidad del estado de la configuración | Registrar e informar de la información necesaria para gestionar la configuración: la identificación aprobada, el estado de los cambios propuestos y el estado de implantación de los cambios aprobados (ISO/IEC TR 18018). |
| Auditoría de la configuración | Examen independiente del estado de la configuración para compararlo con la configuración real (ISO/IEC/IEEE 24765). |
Entre las auditorías de la configuración, IEEE 828-2012 define estas dos:
-
Auditoría funcional (FCA, functional configuration audit): verifica que el desarrollo del elemento de configuración se ha completado satisfactoriamente, que el elemento alcanza las características funcionales y de rendimiento especificadas y que su documentación de operación y de soporte está completa y es satisfactoria.
-
Auditoría física (PCA, physical configuration audit): verifica que el elemento de configuración, tal como se ha construido, se ajusta a la documentación técnica que lo define.
Fuente de la gestión de la configuración
- IEEE Computer Society — SEVOCAB, vocabulario de ISO/IEC/IEEE 24765 (definiciones de configuration management, software configuration management, configuration item, baseline, version, version control, configuration identification, configuration control, configuration status accounting, configuration audit, functional configuration audit, physical configuration audit y configuration control board, con su norma de origen: IEEE 828-2012; ISO/IEC/IEEE 12207, 15288, 24765 y 26511; ISO/IEC TR 18018; ISO/IEC 16350; IEEE 1012): https://pascal.computer.org/sev_display/index.action