Introducción del Control de la Versión Git

Importante

Una guía a mayor profundidad se encuentra disponible en el sitio Web Git.

Git es un sistema de control de versiones distribuido (VCS) creado por Linus Torvalds, también conocido por crear y mantener el kernel de Linux. Version Control es un sistema de seguimiento de cambios de código para desarrolladores. Las ventajas de Git Version Control son:

  • Separar los ambientes de pruebas en ramas

  • Habilidad de navegar a un commit particular sin remover el historial

  • Habilidad para administrar commits de distintas formas, incluso combinándolos

  • Para ver más características, da click aquí

Prerrequisitos

Importante

En el tutorial se utiliza el sistema operativo Windows.

Para descargar e instalar Git utilize los siguientes links:

Nota

Es probable que necesite añadir Git a su ruta

Vocabulario Git

Git gira entorno a distintos comandos principales:

  • Repositorio: la estructura de datos de su código, incluyendo la carpeta .git en el directorio principal

  • Commit: un estado guardado en particular de su repositorio, esto incluye todos los archivos y los añadidos

  • Branch: medios de separación de varios commits, teniendo un historial único. Esto es utilizado principalmente para separar ramas en desarrollo y las ramas estables.

  • Push: actualiza el repositorio remoto con sus cambios locales

  • Pull: actualiza el repositorio local con los cambios remotos

  • Clone: recupera una copia local de un repositorio a modificar

  • Fork: duplica un repositorio pre-existente a modificar, y lo compara con el original

  • Merge: combina varios cambios de diferentes ramas/commits/forks en un solo historial

Repositorio

Un repositorio de Git es una estructura de datos que contiene la estructura, historial, y archivos de un proyecto.

Los repositorios de Git usualmente están conformados por:

  • Una carpeta .git. Esta carpeta contiene diversa información sobre el repositorio.

  • Un archivo .gitignore. Este archivo contiene los archivos o directorios que no quiera incluir cuando actualice el repositorio (commit).

  • Archivos y carpetas. Este es el contenido principal del repositorio.

Crear un repositorio

Puede almacenar el repositorio localmente o de forma remota. Un control remoto es la nube, o posiblemente otro medio de almacenamiento que aloja su repositorio. GitHub es un popular servicio de alojamiento gratuito. Numerosos desarrolladores lo usan, y eso es lo que usará este tutorial.

Nota

Hay varios proveedores que pueden ofrecer repositorios. Gitlab y Bitbucket son algunas alternativas a Github.

Crear una cuenta de GitHub

Continúe y cree una cuenta de GitHub visitando el sitio web y siguiendo las instrucciones de la pantalla.

How to create a new GitHub account.

Creación Local

Después de crear y verificar su cuenta, querrá visitar la página de inicio. Se verá similar a lo que muestra la imagen.

Showing the newly created account homepage.

De clic en el ícono de más (+) de la esquina superior derecha.

Location of the plus button.

Después de click en “New Repository”

Creating a new menu after clicking the plus button.

Llene con la información correspondiente, y después de clic en “Create repository”

Showing the "create repository" button

Debe ver una pantalla similar a esta

The quick setup screen after creating a repository.

Nota

El atajo de teclado Ctrl+~ puede usarse para abrir una terminal en Visual Studio Code.

Ahora querrá abrir una ventana de PowerShell y navegar al directorio de su proyecto. Se puede encontrar un excelente tutorial sobre PowerShell aquí.. Consulte su motor de búsqueda sobre cómo abrir un terminal en sistemas operativos alternativos.

An empty powershell window.

Si un directorio está vacío, hay que crear un archivo para que git tenga algo que rastrear. En el siguiente ejemplo de directorio vacío, creamos un archivo llamado README.md con el contenido de # Example Repo. Para los proyectos de robots FRC®, los siguientes comandos de Proyectos Existentes deben ser ejecutados en la raíz de un proyecto creado por el VS Code WPILib Project Creator. Más detalles sobre los distintos comandos se pueden encontrar en las secciones siguientes.

Nota

Reemplace la ruta de archivo "C:\Users\ExampleUser9007\Documents\Example Folder" con la que desea crear el repositorio y reemplace la URL remota https://github.com/ExampleUser9007/ExampleRepo.git con la URL del repositorio que creó en los pasos anteriores.

> cd "C:\Users\ExampleUser9007\Documents\Example Folder"
> git init
Initialized empty Git repository in C:/Users/ExampleUser9007/Documents/Example Folder/.git/
> echo "# ExampleRepo" >> README.md
> git add README.md
> git commit -m "First commit"
[main (root-commit) fafafa] First commit
 1 file changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 README.md
> git remote add origin https://github.com/ExampleUser9007/ExampleRepo.git
> git push -u origin main

Commits

Los repositorios están conformados principalmente por commits. Los commits son estados guardados o versiones de código.

En el ejemplo anterior, creamos un archivo llamado README.md. Abra ese archivo en su editor de texto favorito y edite algunas líneas. Después de jugar un poco con el archivo, simplemente guárdelo y ciérrelo. Navegue hasta PowerShell y escriba los siguientes comandos.

> git add README.md
> git commit -m "Adds a description to the repository"
[main bcbcbc] Adds a description to the repository
 1 file changed, 2 insertions(+), 0 deletions(-)
> git push

Nota

Escribir buenos mensajes de commit es una pieza clave para un proyecto mantenible. Para una guía de cómo escribir mensajes de commit dar click aquí.

Git Pull

Nota

git fetch puede ser utilizado cuando el usuario no desea que automáticamente se fusione con la rama en la que se está trabajando

Este commando recupera el historial o los commits del repositorio remoto. Cuando el remoto contiene el trabajo que usted no tiene, éste intentará fusionarlo automáticamente. Vea Fusionar.

Corra: git pull

Git Add

Este comando añade el/los archivo(s) seleccionado(s) a un commit. Para hacer commit cada archivo/carpeta que no esté excluido via gitignore.

Corra:  git add FILENAME.txt donde FILENAME.txt es el nombre y extensión del archivo a añadir a un commit. Corra: git add. añadirá todo archivo inexcluido e inlocalizable cuando corra en la raíz del repositorio.

Git Commit

Este comando crea los commit y los guarda localmente. Eso guarda el estado y lo añade al historial del repositorio.

Corra: git commit -m "type message here"

Git Push

Suba (Push) sus cambios locales al repositorio remoto (Cloud)

Corra: git push

Ramas

Las ramas son similares a mundos paralelos para Git. Comienzan igual, y después pueden ramificarse en diferentes caminos. Considere que el flujo de control de Git luce similar a este.

A branch workflow state diagram.

En el ejemplo anterior, main se ramificó (o duplicó) en la rama Característica 1 y alguien revisó la rama, creando una copia local. Luego, alguien confirmó (o subió) sus cambios, fusionándolos en la rama Característica 1. Está «fusionando» los cambios de una rama con otra.

Crear una rama

Corra: git branch branch-name donde branch-name es el nombre de la rama a crear. El nuevo historial de la rama se creará de la rama activa actual.

Acceder a una rama

Una vez que la rama está creada, tienes que entrar a la rama.

Corra: git checkout branch-name donde branch-name es la rama que fue previamente creada.

Fusionar

En situaciones cuando se quiere copiar uno de los historiales de ramas dentro de otro, estos pueden ser fusionados. Una fusión es realizada llamando git merge branch-name con branch-name siendo el nombre de la rama de la cual se fusionará. Se fusiona automáticamente en la rama activa actual.

Es común que un repositorio remoto que contenga trabajo (historial) que usted no tenga. Cada vez que git pull se ejecute, intentará automáticamente fusionar esos commits. Esa fusión se parecerá a la del ejemplo de abajo.

A merge workflow state diagram.

Sin embargo, en el ejemplo anterior, ¿que pasaría si File 1 fuera modificado por las dos ramas FeatureA y FeatureB? Esto es llamado un conflicto de fusión. Un conflicto de fusión puede ser resuelto editando el archivo en conflicto. En el ejemplo, necesitaríamos editar File 1 para poder seguir el historial o los cambios que queramos. Después de que esto se ha realizado, simplemente agregue de nuevo, commit de nuevo y después publique sus cambios.

Resets

Algunas veces, el historial necesita ser reiniciado, o un commit necesita ser deshecho. Esto puede ser realizado de diferentes maneras.

Convirtiendo el Commit

Nota

No puede revertir una fusión, pues git no sabrá que rama u origen deberá escoger.

Para revertir el historial que lleva hacia la ejecución de un commit, corra git revert commit-id. Los IDs de commits pueden ser mostrados usando el comando git log.

Restaurar el Inicio

Advertencia

Restablecer el inicio a la fuerza, es un comando peligroso. Borra permanentemente todo el historial pasado el objetivo. ¡Ha sido advertido!

Corra: git reset --hard commit-id.

Forks

Los forks pueden ser utilizados de manera similar a las ramas. Puede fusionar el upstream (repositorio original) con el origen (forked repositoy).

Clonación de un Repositorio Existente

En el caso de que un repositorio ya esté creado y almacenado en un control remoto, puede clonarlo usando

git clone https://github.com/myrepo.git

donde myrepo.git se reemplaza con su repositorio de git. Si sigue esto, puede saltar a :ref:commits <docs/software/basic-programming/git-getting-started:Commits>`.

Actualizar un Fork

  1. Agrege el upstream: git remote add upstream https://github.com/ORIGINAL_OWNER/ORIGINAL_REPOSITORY.git`

  2. Confirme que se ha agregado a través de git remote -v

  3. Obtenga los cambios del upstream: git fetch upstream

  4. Fusione los cambios con el inicio: git merge upstream/upstream-branch-name

Gitignore

Importante

Es extremadamente importante que los equipos no modifiquen el archivo .gitignore que se incluye con su proyecto de robot. Esto puede provocar que la implementación sin conexión no funcione.

Un archivo .gitignore se usa comúnmente como una lista de archivos para no confirmar automáticamente con git add. Cualquier archivo o directorio listado en este archivo no se confirmará. Tampoco aparecerán con git status.

Información adicional puede ser encontrada aquí

Ocultar una Carpeta

Simplemente añada una nueva línea que contenga la carpeta a ocultar, con una diagonal al final

EJ: directory-to-exclude/

Ocultar un Archivo

Añada una nueva línea con el nombre del archivo a ocultar, incluyendo algún directorio pre-pendiente relativo a la raíz del repositorio.

EJ: directory/file-to-hide.txt

EJ: file-to-hide2.txt

Información adicional

Un tutorial mucho más a fondo puede ser encontrado en el sitio web official de git website.

Una guía para corregir los errores comunes puede ser encontrada en el repositorio de `reglas de vuelo<https://github.com/k88hudson/git-flight-rules/blob/master/README.md>`_ repository.