08-Control de Versiones - 2023
08-Control de Versiones - 2023
08-Control de Versiones - 2023
CONTROL DE VERSIONES
¿De qué sirven las emociones si no se pueden compartir?
(Anna Gavalda)
Un sistema de control de versiones (VCS por sus siglas en inglés) es un sistema que
registra los cambios realizados sobre un archivo o conjunto de archivos a lo largo del
tiempo, de modo que pueda recuperar en cualquier momento versiones específicas. Si, por
ejemplo, usted es un diseñador gráfico o un desarrollador web, y quiere mantener cada
versión de una imagen o de un archivo HTML de un sitio web, una de las decisiones más
importantes para su proyecto podría ser la de tener un sistema de control de versiones ya
que permitiría revertir proyectos o parte de ellos a un estado anterior, comparar cambios a
lo largo del tiempo, y ver quién modificó por última vez algo que puede estar causando un
problema, quién introdujo un error y cuándo, entre otras cosas más. Usar un control de
versiones, si está en la nube, permite también tener una copia de los archivos en cualquier
momento.
1
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Nota
GIT
2
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Para descargarse la versión para Sistemas Operativos debe dirigirse al siguiente sitio web:
https://git-scm.com/. Esta versión tiene tanto la versión de línea de comando como la
interfaz gráfica de usuario estándar. Otra solución es trabajarlo directamente desde un
IDE, esto tiene como ventaja que puede trabajarlo todo desde el propio entorno sin tener
que salir del mismo.
Nota
REPOSITORIOS
3
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Por otro lado, debido a lo que se comentó anteriormente Git tiene tres estados principales
en los que se pueden encontrar los archivos: confirmado (committed), modificado
(modified), y preparado (staged). Cuando creamos un archivo en VsCode en el Panel de
Control de Código podemos observar que al costado del archivo aparece la letra ‘U’ esto
significa que el archivo esta sin seguimiento, es decir que el control de versiones no está
enterado de su existencia ya que no está en el repositorio. Al hacer un click sobre el icono
+ a la izquierda del archivo se agrega para ser rastreado por el control de versiones. Ahora
podemos ver que el costado del archivo ha cambiado por una letra ‘A’ que representa un
nuevo archivo que se ha añadido al repositorio. Si se confirma el archivo al realizar un
commit debería notar (como es lógico) que no hay cambios pendientes, junto a ello se
suele escribir un comentario indicando los cambios que se han realizado en el código. Una
vez realizado un commit Git creara una nueva versión y generara una snapshot, de esta
forma si en un futuro queremos revertir un cambio podremos volver a la versión anterior
entre los commits realizados. Ahora si modificaremos el archivo debería aparecer la letra
‘M’ que significa que el archivo ha sido modificado, pero no se ha confirmado en el
repositorio local.
Pero además de todo lo que vimos se pueden generar “ramas” (branches) que son líneas
alternas que se generan a la par de la línea principal (master o main). Con esta
característica podemos generar un branch para agregar una nueva funcionalidad a
nuestro proyecto sin afectar el contenido principal, por ejemplo, se podría tener dos ramas
adicionales más la principal es la rama master/main (producción), la segunda rama para
desarrollo y una tercera para pre-producción.
GIT
Estos dos comandos configuran las credenciales (usuario y correo) para trabajar con los
repositorios, es necesario ejecutarlo la primera vez que trabaja con GIT y son necesarias
para etiquetar los commits con sus datos.
Nota
4
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
¿Y qué es GitHub? Un hosting online para los repositorios que utiliza Git para el
mantenimiento y versionado del código fuente, añadiendo una serie de servicios extras
para la gestión del proyecto y el código fuente. La versión gratuita de este hosting permite
alojar nuestro código en repositorios públicos.
Nota
Clonar un repositorio extrae una copia integral de todo el proyecto alojado en GitHub que
tiene en ese momento, incluyendo un registro de todo su historial para cada archivo y
carpeta del proyecto. Para realizar esto debemos tener la dirección del repositorio que
queremos clonar (generalmente es del tipo https://github.com/<username>/ <repo-name>
.git):
¿QUE ES UN FORK?
5
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
En ese momento ya tendrá un fork del repositorio original que sólo estará disponible en su
cuenta de GitHub. Es exactamente el mismo repositorio, hasta que empiece a hacer
cambios.
Nota
Como puede ver bifurcar un repositorio publico solo puede llevar unos
segundos es la forma habitual con que se trabajan con proyectos Open
Source. En el caso de que el repositorio sea privado la organización
tendrá que incluirlo como colaborador antes de intentar bifurcarlo.
REPOSITORIOS LOCALES
Use el comando git init para crear un nuevo repositorio a partir de una carpeta existente
en el equipo. En la línea de comandos, vaya a la carpeta raíz que contiene el código y
ejecute:
git init
A partir de estos momentos VSCode creará una carpeta con el nombre. git dentro de su
área de trabajo (no podrá ver esto de su Explorador de archivos de VSCode, ya que es un
directorio oculto, pero puede encontrarlo en su administrador de archivos en la carpeta
raíz de su proyecto).
Nota
Una vez que ya tenemos un repositorio es importante saber en qué estado se encuentran
los archivos que tenemos en nuestro proyecto, el comando git status nos devuelve un
resumen del estado del repositorio, diciéndonos en que rama estamos, cuales son los
archivos que tienen cambios, y cuáles son los archivos que no están siendo considerados
para el próximo commit. Para esto usamos el comando git status:
git status
6
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
On branch master
No commits yet
Untracked files:
(use "git add <file>..." to include in what will be committed)
index.html
main.js
styles.css
nothing added to commit but untracked files present (use "git add" to track)
Como vemos nos informa la rama en que nos encontramos trabajando, si se ha hecho un
commit y los archivos que no se encuentra siguiendo. Con el comando git add, puede
incorporar las modificaciones de un archivo en el directorio de trabajo al área de
preparación. Básicamente, notifica a Git de cualquier cambio que deba incluirse en el
siguiente commit:
Donde filename puede ser todos los archivos, colocando un punto (.), o una lista con los
nombres de los archivos junto a su extensión separados por espacios en blanco.
A pesar de esto, no ocurrirá ninguna alteración importante hasta que ejecute el comando
git commit; de ahí que git add sea simplemente un paso intermedio para agregar posibles
actualizaciones a consideración. Luego para realizar un commit desde la línea de
comando debemos tipear lo siguiente:
El comando git commit es el que realmente registra los cambios que ha realizado. Con este
comando, también agregará una descripción de lo que se hizo con la adición de la opción
-m seguido de un mensaje. Esto permite que otros colaboradores sepan qué tipo de
modificaciones se incluyeron en este commit. Una vez publicado el commit, se limpiará el
área de staging, y el repositorio pasará a incluir la versión más actualizada de esos
archivos. Si tipeamos el siguiente comando:
git status
7
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
On branch master
nothing to commit, working tree clean
Esto indica que sobre la rama master no hay nada para comitear o sea que la rama está
limpia. Para mostrar una lista de los últimos commits realizados debemos tipear lo
siguiente:
Este comando permite ver los commits realizados agrupando cada commit en una sola
línea.
Nota
Nota
¿Cuándo conviene hacer commit? Es una pregunta que no tiene una única
respuesta correcta. Cada desarrollador tiene sus criterios. En general se
realiza cuando el proyecto responde a nueva funcionalidad o un gran
cambio.
8
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Puede indicar a Git que no realice un seguimiento de determinados archivos del proyecto
agregando y configurando un archivo .gitignore. Por ejemplo, los archivos temporales del
entorno de desarrollo, las salidas de prueba son ejemplos de archivos que probablemente
no necesiten realizar un seguimiento. Este archivo se agrega en la raíz de nuestro
proyecto y en cada línea se indica que archivo o carpeta ignorar. Por ejemplo:
#Archivos a Ignorar
.env
logs/
El branching es lo que hace que la gestión de la versión del código sea más poderosa. En
lugar de un enfoque lineal, como el que hemos estado discutiendo hasta ahora, las ramas
de Git permiten a los desarrolladores crear nuevas “versiones” de su base de código y
realizar un seguimiento de los cambios de forma independiente. Por ejemplo, supongamos
que está trabajando en una rama de característica llamada new-feature. Esta rama se
utilizará para realizar un seguimiento de todos los cambios relacionados con esa
característica en particular. De esta manera, puede mantener tu base de código principal
(generalmente denominada main o master) separada de lo que se está haciendo en la
rama de características. Para saber en qué rama estamos trabajando debemos tipear lo
siguiente:
git branch
Si desea listar las ramas (Local o Remotas) debe tipear el siguiente comando:
git branch -a
9
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Nota
Nota
Siempre puedes usar el comando git branch para saber en qué rama
estamos. El nombre de la rama con asterisco al lado indica a qué rama está
apuntado en un momento dado.
Una vez que haya realizado todos los cambios que necesite, puedes simplemente hacer
commit de ellos y luego volver a cambiar a la rama principal usando:
Supongamos que ha realizado algunos cambios en una nueva rama y desea integrarlos
con la rama principal (master). Para fusionar una rama con otra el desarrollador primero
debe cambiar a la rama que recibirá los cambios (Supongamos que este caso es master):
Una vez que el desarrollador ha cambiado a la rama principal, puede usar el comando git
merge para fusionar:
En palabras simples, este comando se utiliza para combinar dos ramas. Siendo el nombre
de la rama la rama que quiere fusionar con la actual.
10
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Nota
Todos los procesos de Git ocurren en forma local, sobre nuestra computadora. No obstante,
podemos usar servicios como GitHub, GitLab o Bitbucket para alojar una copia de nuestros
proyectos en remoto. Esto es una buena idea para tener una copia de seguridad en remoto
y es imprescindible para trabajar en equipo. Cada persona del equipo puede subir sus
commits al mismo repositorio en remoto. Colaborar con otros implica gestionar estos
repositorios remotos, y mandar (push) y recibir (pull) datos de ellos cuando necesite
compartir cosas. Una vez que ha hecho commit de sus cambios en un repositorio local,
puedes enviarlo a un repositorio remoto. Esto es lo que permite a los colaboradores
trabajar en el mismo proyecto y mantenerse actualizados sobre el progreso de cada uno.
11
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Nota
A partir del año 2020 GitHub ha decidido cambiar el nombre de la rama por
defecto o principal de master a main. Todos los repositorios nuevos que se
creen empezarán a mostrar main como rama principal.
git remote -v
Si no figura ningún repositorio debe agregarlo para ello debe escribir desde la terminal el
siguiente comando:
12
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Esta línea sólo la debe ejecutar una vez por repositorio remoto. En la mayoría de los casos
el nombre del remote se define por defecto en la creación del repositorio con el nombre de
origin (este es un alias para no recordar la dirección completa, pero puede ser cualquier
otro nombre).
Ahora si escribimos el siguiente comando:
git remote -v
El resultado será:
Luego debemos modificar el nombre de la rama actual a main ya que en GitHub a partir
del año 2020 la rama predeterminada de un repositorio se denomina main y pasar todo el
historial que tengamos (en caso de que los haya) de master a la nueva rama:
Nota
git push
Y funcionará correctamente.
13
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Para colaborar con un proyecto es necesario estar registrado para ese proyecto como
colaborador en GitHub, para ello es necesario primero poseer una cuenta en GitHub. Luego
el jefe de proyecto desde su cuenta dará acceso de escritura al repositorio a los miembros
del proyecto que podrán modificar el código, de esta forma podrán funcionar los push.
Desde su cuenta de GitHub deberá ir a la opción Settings y luego seleccionar su repositorio
y agregar los colaboradores del proyecto.
Una vez hecho un push, cualquier integrante del equipo podría descargarse nuestros
cambios escribiendo desde dentro de su copia local el siguiente comando:
Si hay conflictos durante la fusión, la operación de Git Pull no será automática, y será
necesario que corrija los cambios en los archivos afectados, luego deberá publicar un
commit con dichas correcciones en el repositorio local, y, seguidamente, subirlos en el
repositorio remoto mediante un Git Push.
Si este desarrollador quisiera revisar las modificaciones que se han realizado en el
repositorio podría ejecutar:
git log
Nota
14
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Vamos a suponer que queremos clonar un repositorio y colocar el contenido del mismo en
otro repositorio distinto. En este caso primero debemos clonar el repositorio como lo
hicimos anteriormente. Ahora al listar los repositorios remotos veremos lo siguiente:
En este listado podemos ver que todavía se apunta al servidor clonado, para ello debemos
eliminar los repositorios de esta manera:
VIAJE EN EL TIEMPO
15
Capítulo 8 Control de Versiones C.F.P Nro. 401 de San Martín
Ahora, supongamos que queremos restablecer nuestro repositorio al commit anterior. Una
forma de hacerlo es cambiar temporalmente al commit anterior usando el comando git
checkout.
Ahora puede realizar todo lo que desea sobre ese commit sin preocuparse de perder el
estado actual del proyecto. Puede volver al estado actual del proyecto escribiendo el
siguiente comando:
Ahora vamos a suponer que modificamos uno o más archivos y por error realizamos un
commit y los subimos al servidor haciendo un push, pero nos dimos cuenta que esos
cambios que hemos hecho no permite que la aplicación funcione correctamente. Podemos
hacer un revert de los cambios. Un revert es una operación que toma un commit
específico y crea un nuevo commit con el contenido del commit especificado de esta
forma no pisamos nuestro historial.
Con git revert se crea un nuevo commit que revierte los cambios realizados en el último
commit, pero no elimina dicho commit.
El comando anterior va a revertir el último commit que hemos realizado, esto será solo en
nuestra computadora, para subir este cambio al servidor debemos correr también el
comando git push.
16