Exploración del control de versiones mediante Git
Hay diferentes tipos de sistemas de control de versiones (VCS), pero por lo general se pueden clasificar como centralizados y distribuidos. En los últimos años (parcialmente debido a la creciente popularidad de DevOps), la última categoría ganó una popularidad significativa, con Git convirtiéndose en el estándar de facto en el desarrollo de software moderno. Este VCS concreto sería la opción más adecuada para la organización en nuestro escenario de ejemplo, especialmente teniendo en cuenta su intención de usar GitHub como plataforma de destino para su transición de DevOps. En esta unidad, explore el uso de Git como control de versiones.
Control de versiones centralizado frente a distribuido
Tanto los sistemas centralizados de control de versiones (CVCS) como los sistemas de control de versiones distribuidos (DVCS) ofrecen la capacidad de administrar y realizar un seguimiento de los cambios en los proyectos de desarrollo de software. Las principales diferencias entre ellas están relacionadas con la forma en que implementan repositorios y colaboración. En particular:
- Ubicación del repositorio: en sistemas centralizados, hay una única instancia centralizada del repositorio que contiene el historial completo del proyecto. En los sistemas distribuidos, cada miembro del equipo normalmente tendría una copia local totalmente funcional de todo el repositorio, lo que podría incluir su historial de versiones completo.
- Conectividad de red: en sistemas centralizados, se requiere acceso a la instancia centralizada del repositorio para realizar muchas acciones, incluidas las actualizaciones y la recuperación del historial. En los sistemas distribuidos, todas las actividades se pueden realizar en la copia local del repositorio.
- Modelo de colaboración: en sistemas centralizados, los desarrolladores revisan los archivos de la instancia centralizada del repositorio mientras están conectados a él a través de una red antes de realizar modificaciones y confirmar los cambios. Esto impide que otros usuarios puedan extraer los cambios de los archivos. En los sistemas distribuidos, los desarrolladores realizan y confirman cambios en su copia local del repositorio, que, en algún momento posterior, se sincronizan con otras copias.
- Modelo de bifurcación y combinación: en sistemas centralizados, la bifurcación y la combinación normalmente requieren coordinación con otros. En los sistemas distribuidos, las ramas se pueden crear de forma independiente en copias locales y combinarse posteriormente.
Cabe destacar que, aunque el modelo distribuido no depende de tener un repositorio central (en el sentido tradicional), es habitual implementar una copia del repositorio, que se hospeda en servicios como GitHub, GitLab o Bitbucket. Esta instancia actúa como punto focal de colaboración y sincronización.
Terminología de Git
Para convertirse en experto en trabajar con Git, es importante familiarizarse con su terminología. Algunos de los conceptos son únicos para Git, lo que lo distingue de otros DVCS. Los términos de Git más fundamentales incluyen:
- Árbol de trabajo: una estructura de directorios que contiene todos los archivos del proyecto.
- Repositorio (comúnmente denominado repositorio): el directorio ubicado en el nivel superior de un árbol de trabajo, hospedando todos los archivos del proyecto junto con el historial de versiones de estos archivos.
- Clonar: la acción de crear una copia de un repositorio remoto en una máquina local para trabajar en un proyecto al que tiene acceso.
- Bifurcación: la acción de crear una copia hospedada en GitHub de un repositorio remoto para trabajar en un proyecto al que no tiene acceso. Normalmente, se usa una bifurcación si piensa contribuir al proyecto de otra persona o crear su propia versión de dicho proyecto. Aunque no tienes acceso de escritura al repositorio original, puedes administrar completamente tu fork.
- Confirmación: una instantánea de los cambios realizados en los archivos de un repositorio en un momento dado específico. Los commits se usan para registrar y guardar los cambios.
- Área de almacenamiento provisional una ubicación intermedia (que no forma parte del repositorio) donde se preparan los cambios en los archivos del árbol de trabajo antes de confirmarlos. Permite a los desarrolladores seleccionar los cambios que piensan confirmar.
- Rama: una serie con nombre de las confirmaciones vinculadas. En términos simples, una rama representa una versión distinta de un proyecto. Esto permite trabajar en diferentes partes de un proyecto al mismo tiempo sin afectar a su versión principal. La confirmación más reciente en una rama se denomina nivel superior. La rama predeterminada generada automáticamente al inicializar un repositorio se denomina main o master.
- Combinar: proceso de combinación de cambios de una rama (o confirmación) en otra. Esto integra los cambios de una rama en otra.
- Objeto: uno de los cuatro tipos de entidades disponibles en un repositorio. Estas entidades incluyen los blobs que representan archivos individuales, un árbol que representa un árbol de trabajo, una confirmación que representa una versión específica del árbol de trabajo y una *etiqueta, que es una etiqueta asignada a una confirmación individual.
- Hash: un identificador de longitud fija y único generado automáticamente que representa el contenido de un objeto. Siempre que ese objeto cambie, también cambia su hash. Esto permite a Git determinar qué contenido de un repositorio se ha actualizado.
- Remoto: una referencia a otro repositorio (distinto del local), que normalmente apunta a la instancia hospedada por el servicio del repositorio. Esto sirve como valor predeterminado para las operaciones de inserción y extracción.
- Incorporación de cambios: la acción que recupera los cambios de un repositorio remoto y los combina en la rama actual.
- Envío de cambios: la acción que envía confirmaciones locales a un repositorio remoto, actualizándolo con los cambios realizados localmente.
- Recuperación de cambios: la acción que recupera los cambios de un repositorio remoto sin combinarlos automáticamente. Esto permite su revisión antes de aplicar una combinación.
- Solicitud de incorporación de cambios: una característica en plataformas de hospedaje basadas en Git (como GitHub) que permite a los desarrolladores proponer cambios y solicitar que se combinen en una rama de destino.
Git también tiene un amplio conjunto de comandos, que proporcionan la capacidad de implementar y gestionar por completo el control de versiones a través del terminal de comandos, como Linux Bash o el terminal de comandos de Windows. Como alternativa, puede administrar Git a través de aplicaciones de escritorio como GitHub Desktop. Las plataformas de hospedaje basadas en Git proporcionan una interfaz web que facilita la interacción con los repositorios del lado del servicio.
Git frente a GitHub
Como se ha descrito anteriormente, Git es un DVCS de código abierto multiplataforma que facilita la colaboración mediante repositorios locales, que se pueden sincronizar con repositorios remotos. GitHub es un servicio basado en la nube que proporciona una plataforma de hospedaje para repositorios de Git. Amplía la gama de funcionalidades de Git mediante la inclusión de compatibilidad con:
- Repositorios remotos: facilitar la interacción entre los equipos distribuidos.
- herramientas de colaboración: ofrecer características como problemas, discusiones, solicitudes de incorporación de cambios, notificaciones, etiquetas, acciones, bifurcaciones, wikis y proyectos.
- Interfaz basada en web: minimización de la necesidad de usar comandos de Git
- Protección de rama: aplicación de condiciones que deben cumplirse antes de que se pueda realizar una combinación (por ejemplo, revisiones de pull requests completadas).