Git es un sistema de manejo de versiones distribuido creado por Linus Torvalds.
Los sistemas de manejo de versiones permiten tener un control detallado sobre el historial de cambios de un archivo o conjunto de archivos creando instantaneas de estos conjuntos cada que se presenta un cambio. Estos sistemas de control de versiones pueden ser centralizados (ejemplo subversion) o distribuidos (ejemplo git), acorde a si existe un repositorio principal donde se maneja el historial y desde el cual todos los demas repositorios extraen las versiones requeridas, o si todo el historial se distribuye en cada repositorio.
Para el desarrollo de esta sesión se requiere la creación de cuenta en github o bitbucket.
Para la instalación de git use el siguiente procedimiento.
Si usa sistema operativo windows puede descargar los binarios del cliente de git for windows y durante la instalación usar la configuración recomendada.
En su sistema linux, muy probablemente encontrará el cliente de comandos para instalar desde el repositorio de su distribución.
sudo apt install git
Si desea realizar la autenticación por medio de SSH requiere instalar los paquetes adicionales a SSH, sin embargo se recomienda la autenticación por medio de HTTP para reducir el número de pasos requeridos, y cuando se desea trabajar en equipos de uso no habitual o que siendo de uso frecuente podría ser usado por un tercero. Igualmente, al usar autenticación por HTTP es posible conectarse a pesar de los bloqueos que por seguridad establecen las politicas de muchas entidades.
En mac, puede usar igualmente a linux la instalación por binarios disponibles en la página oficial, git.
Puede usar un cliente multiplataforma y gráfico de fácil instalación como gitkraken o github desktop (este último solo para windows o mac), sin embargo para fines de este curso se exigirá el manejo directo del cliente de comandos de git.
In [1]:
%%bash
git --help
In [2]:
%%bash
git clone https://github.com/cosmoscalibur/herramientas_computacionales.git herramientas
De esta forma crearemos una copia del repositorio git herramientas_computacionales
en el directorio ./herramientas
. Si no se indica el directorio, se crea un directorio nuevo en la posición actual.
Tras el clonado, tenemos a disposición todo el directorio del repositorio, incluido el directorio .git
que almacena la información del historial y repositorios (para este momento, heredada del repositorio clonado).
In [3]:
%%bash
cd herramientas
ls -oha
Se evidencia que tras el clonado, tenemos configurados los repositorios remotos por defecto.
In [4]:
%%bash
cd herramientas
git remote -v
En caso de ser un repositorio nuevo o desear reinicializar (aceptar nuevas plantillas o mover el directorio), debemos crear el directorio .git
y agregar los elementos que teniamos en nuestro directorio. Siempre que se agreguen (o se realiza cualquier actualización de los archivos y directorios, se sugiere realizar un commit
para la indicación de la acción en nuestro historial).
In [5]:
%%bash
cd herramientas
git init
In [6]:
%%bash
cd herramientas
git remote add pruebas https://github.com/cosmoscalibur/pruebas.git
git remote -v
Tambien es posible eliminar el acceso al servidor remoto, con git remote rm
.
In [7]:
%%bash
cd herramientas
git remote rm origin
git remote -v
A continuación, y para evitar posibles conflictos de los archivos, es recomendable iniciar con un fetch
o pull
para obtener los objetos y referencias del repositorio remoto (esto si creamos el repositorio con los archivos de licencia y README.md
que nos invita a crear el servicio git), y hacer la unión del contenido existente en el remoto con el local justo en el local.
git pull pruebas master
El paso anterior se evita si solo usamos el servicio para la creación del repositorio remoto vacio en lugar de poblarlo con los asistentes de archivo de licencia y archivo de descripción. Si en el paso anterior los archivos del repositorio remoto y el local poseen los mismos nombres pero son diferentes, pueden existir conflictos que deban resolverse de forma manual.
Crearemos archivos de prueba la adición al repositorio.
In [9]:
%%bash
cd herramientas
echo "linea 1" > probar_1
printf "s\n 5" > probar_2
Aunque en este caso es claro que nuestros archivos no se encuentran agregados al repositorio, consultaremos por el estado de los archivos frente a su registro en el repositorio.
In [10]:
%%bash
cd herramientas
git status
Ahora agregamos al registro los archivos de nuestro repositorio local.
In [11]:
%%bash
cd herramientas
git add . # Con la indicación "." agrega todo.
git commit -m "Agregados archivos de prueba 1 y 2."
Realizaremos una modificación en uno de los archivos y agregaremos directamente a este.
In [12]:
%%bash
cd herramientas
echo "linea 2" >> probar_1
printf "otro\narchivo\npara probar." > probar_3
git add probar_1 probar_3
git commit -m "Actualizado prueba 1 y agregado prueba 3."
Es posible indicar directamente a git la eliminación de archivos mediante
git rm archivo
o tambien al eliminar el archivo de manera directa, se incluye en git
git add -A
con el fin de actualizar el arbol de archivos y rastrear incluso los archivos eliminados. Sin embargo, es recomendable que la adición y remoción de archivos sea lo más especifica posible con el fin de tener un registro descriptivo que ayude a la adecuada solución de problemas o la descripción de cambios de una versión a otro de los códigos. Tengase en cuenta que en el caso de directorios, debe indicarse el argumento recursivo para el borrado.
Si se desea eliminar un archivo del repositorio pero no del disco, debe eliminarse de la cache del repositorio.
git rm --cached archivo
Posterior a esto, realizamos el commit asociado.
Ahora deseamos actualizar nuestro repositorio remoto con nuestro repositorio local, para lo cual debemos hacer un push con el nombre del repositorio remoto y el nombre del branch que por defecto si solo hay uno es master. Es posible configurar el push para que su acción sea la de enviar todos los branchs del repositorio pero es preferible un control más fino con el fin de reducir el trafico de datos en la red.
In [13]:
%%bash
cd herramientas
git push pruebas master
Durante la ejecución del push se nos solicitará el usuario y contraseña de nuestra cuenta en el servicio git. Al usar el protocolo https por defecto tendremos 3600 segundos tras cada autenticación, o si lo preferimos podemos usar ssh y crear la llave de autenticación con el fin de tener acceso permanente en nuestro equipo privado sin requerir de la autenticación continua.
Para la actualización de nuestro repositorio local con el repositorio remoto reaizamos una acción pull, tal cual se indico en la subsección anterior para actualizar el repositorio local con los archivos que posiblemente se crearon con el asistente del servicio git.
Se recomienda la lectura de otras acciones de git importantes, las cuales son: branch
y merge
para experimentar con modificaciones de un código base y su posterior unión al original, o log
, show
para la visualización del historial de modificaciones.
Si particularmente queremos ver el estado del repositorio en un commit especifico, usamos checkout
seguido del commit. Esta acción no genera ninguna modificación del repositorio y para continuar en el último estadosolo debemos volver a nuestro estado actual realizando el checkout al master. Si deseamos conservar este estado consultado realizamos una reversión al commit dado con reverse
.
Si la acción anterior se realiza sobre un archivo, los cambios deben deshacerse con checkout a HEAD
seguido del archivo, de lo contrario el estado del archivo consultado estará como una modificación.
Igualmente existen acciones de interes en caso de usar los servicios git como la acción del fork
que hace uso de la solicitud de pull (acciones no incluidas en git pero que pueden ser usadas con clientes basados en las API de los servicios git).
Es posible tener submodules para lo cual git ofrece la utilidad submodule
para su gestión.
In [14]:
%%bash
cd herramientas
git log --oneline
In [15]:
%%bash
cd herramientas
git show d193ae6
In [16]:
%%bash
cd herramientas
echo "Actual"
ls
git checkout e4a4be5
echo "Anterior"
ls
git checkout master
In [17]:
%%bash
cd herramientas
echo "Actual"
cat probar_1
git checkout d193ae6 probar_1
echo "Anterior"
cat probar_1
git checkout HEAD probar_1