Tiempo de lectura: 20 minutos.
Público objetivo: Desarrolladores de software
Nivel: Básico/Intermedio.
Fecha publicación: 22 de Marzo de 2018
Hola nuevamente!, en esta entrada de blog quiero explicarles cómo usar algunos comandos básicos de Git, espero sean de gran ayuda y puedan ser más eficientes con la administración del código que desarrollan, además para que no sufran pensando que perderán el trabajo si ingresan mal algun comando. Decidí hacer esta entrada ya que la mayoria de documentación de Git esta en ingles y es muy extensa para explicar un comando sencillo. Empecemos.
Es un software libre para el versionamiento del código cuyo propósito es llevar un registro de todos los cambios que se realizan en el mismo, de manera que se pueda saber puntualmente quien actualizó el código, que actualizó y cuando, así no mantener código basura (código que nunca es invocado o usado para hacer pruebas) y mejorar el trabajo con otros desarrolladores.
La terminología sobre git es generalmente en ingles, en esta entrada explico en español, hay una imagen que quiero compartirles sobre lo que es una rama o branch en git:
En esta imagen la linea amarilla representa la rama master, las bolitas amarillas son commits (Un merge es la mezcla de una rama con otra, tambien se genera un commit), la linea azul es una rama que partio desde master y se mezclo otra vez, su nombre es 117-hotfix-fixed-tests, la linea naranja que se alcanza a ver mas arriba es otra rama.
Existen algunas herramientas en línea para desarrollar software de manera colaborativa, Github es la más conocida actualmente y la que más proyectos libres tiene, para crear repositorios privados es necesario adquirir una licencia, aunque para estudiantes hay un paquete que ofrece repositorios privados gratis. Gitlab es la que usamos en Elemental Lab para alojar todos nuestros proyectos, ofrece repositorios privados ilimitados de manera gratuita, además de herramientas adicionales para hacer seguimiento a los desarrolladores y automatización (Continuous Integration, Continuous Deployment, etc.)
A pesar de las grandes ventajas que tiene Git, aún hay muchos desarrolladores y empresas que en vez de usarlo utilizan otras herramientas para compartir, actualizar y subir código a los servidores como por ejemplo correo electrónico, he conocido algunos casos donde se solicita a los desarrolladores crear módulos en producción, y no solo un desarrollador, más de uno editando código al tiempo, como consecuencia, hay mucho desorden, código basura, muchos más errores, perdida del código desarrollado por otras personas, entre otros.
En el sistema operativo Ubuntu:
sudo apt-get install git
Luego es necesario correr los siguientes comandos, estos identifican quien sube cambios al repositorio, el correo debe ser el registrado en el software usado para versionar (ej. gitlab)
git config --global user.name "Tu Nombre"
git config --global user.email "tu-correo@dominio.com"
En general la mayoría de los comandos usados en Github, Gitlab, Bitbucket, etc son lo mismo, solo unas pocas cosas difieren, por ejemplo para combinar el código hecho por un desarrollador con el de otro desarrollador o con la rama (branch) principal del proyecto en Github es “pull request” y en Gitlab es llamado “merge request”.
Git clone es usaro para descargar el proyecto desde una de estas plataformas al computador. Existen 2 formas de descargar un repositorio una por https o por ssh (Secure Shell)
git clone nombre-repositorio
ejemplo:
git clone https://gitlab.com/elementalab/xshop.git
Usando https se debe ingresar la contraseña de la cuenta (email) con la que se hizo el registro en una de estas plataformas, si el repositorio es público no es necesario.
Al realizar cambios en uno o varios archivos de un proyecto (por ejemplo clonado) se puede saber que se modificó con este comando, debe ser ejecutado en el directorio del proyecto.
se ejecuta asi:
git status
Ejemplo:
git status muestra el branch actual (master), cambios en el stage (preparados para hacer un commit, se explica mas adelante) y los modificados.
Este comando es utilizado para preparar los archivos a ser subidos al repositorio, se utiliza así:
git add ubicación-archivo
ejemplo:
git add xshop/settings.py
La ruta puede ser copiada tal cual se muestra al hacer git status (modified)
Si se desea añadir todos los archivos modificados se puede usar:
git add .
Git commit se usa para dar una descripción corta, autor y fecha a un conjunto de archivos modificados, la descripción comenta que se hizo en los archivos modificados, git commit se utiliza luego de preparar los archivos usando git add.
git commit -m 'descripción de los cambios'
Ejemplo (en Elemental Lab hacemos los commit en inglés por estándar)
git commit -m 'Implementa procesador de contextos para enviar variables a las plantillas'
Muchas veces al hacer git add y git commit algún archivo quedó haciendo falta, o se hizo una modificación después, para que el ultimo commit realizado abarque el/los archivos modificados se usa este comando así:
git add archivo-adicional
git commit --amend
Comando usado para subir los cambios al repositorio, luego de hacer git commit (uno o varios)
git push origin nombre-de-la-rama
El nombre “origin” es por defecto configurado al clonar el repositorio, “origin” hace referencia al repositorio en Gitlab, Github, etc., y puede tener un nombre diferente o varias opciones apuntando a otros repositorios.
Ejemplo:
git push origin master
git push remote 231-error-en-registro-usuarios
Comando usado para descargar cambios de un alojamiento de repositorios al proyecto en el computador, se especifica el nombre de la rama (branch) para descargar solo los cambios de la misma, pueden ser por ejemplo cambios realizados por otro desarrollador.
git pull origin nombre-de-la-rama
Ejemplo:
git pull origin master
Nota: La rama en el computador deberia ser la misma en la que se usa el comando, ya que si son diferentes se haria una mezcla de ramas
Comando utilizado para guardar los cambios actuales del código temporalmente, usa una pila, este comando es útil si se desea hacer “git pull” desde el alojamiento de repositorios debido a cambios realizados por otro desarrollador y esos cambios afectan algunos de los archivos editados, es comun usarlo tambien cuando se desea cambiar de una rama a otra, se usa asi:
git stash
Para sacar los datos de la pila se utiliza el siguiente comando
git stash pop
Este comando tiene varios usos, uno de ellos es crear nuevas ramas así:
git checkout -b nombre-rama
Ejemplo:
Si estamos en la rama master y tenemos algunos archivos modificados, este comando creará la nueva rama como una copia de la rama master y además mantendrá los archivos modificados tal cual
git checkout -b implementacion-carrito-compras
Este comando también sirve para cambiarse de una rama a otra, así:
git checkout nombre-rama
En caso de que haya algún archivo modificado y cree conflicto al cambiarse de rama se puede usar el comando git stash para poder pasarse de rama y luego solucionar conflictos.
git branch muestra la rama actual:
git branch
También se usa para eliminar una rama así:
git branch -D nombre-rama
Comando usado para ver el histórico de commits realizados en la rama actual
git log
Ejemplo:
Cada commit es identificado con un hash, como pueden ver aparece el autor, la fecha y la descripción que tiene el commit.
Comandos que representan un mayor cuidado pero fáciles de usar
Este comando se usa para deshacer acciones hechas con otros comandos, por ejemplo al hacer git add, asi:
git reset
Si se han realizado cambios a uno o varios archivos y se desea remover los mismos se puede utilizar el siguiente comando, (este comando no borra nada de los commits ya realizados)
git reset --hard
También se usa para deshacer commits o para dejar el repositorio en una versión ó rama especifica, solo se debe especificar la versión (tag configurado en el repositorio, basicamente es una referencia a un commit) o el hash del commit, ejemplo:
git reset 10bd435b19894d8a3a28598a7b176c992ff35d9a --hard
Comando útil cuando otro desarrollador ha realizado cambios en la misma rama en la que se está trabajando de manera local y esta última tiene commits también.
Toma como base la rama en un punto antes de los cambios del otro desarrollador y de los realizados localmente, luego pone encima los commits del otro desarrollador y luego los hechos en local
Ejemplo:
git pull --rebase origin 245-mejora-de-rendimiento-imagenes
En caso de que los cambios descargados no se puedan mezclar con los que están en local se deben solucionar, generalmente git ayuda un poco en la terminal mostrando que sucede (archivos aparecen con este copy: both modified) y qué comandos se pueden utilizar, si hay conflictos en el código se deben solucionar, se muestran así en el código:
<<<<<<< a4a27607f0ac3b17343a764e36f9e67d97e2b92a
...
...
=======
...
...
>>>>>>> nombre-branch-editado-localmente
solucionar y hacer:
git add archivo-con-conflicto-solucionado
git add otro-archivo-con-conflicto-solucionado
Luego hacer:
git rebase --continue
Si se desea abortar se usa:
git rebase --abort
Comando realizado para mezclar cambios de una rama a otra, en las plataformas de alojamiento esto se puede realizar de manera automática, a menos que haya conflicto en alguno de los archivos
localmente también se puede hacer una mezcla de ramas, simplemente se ejecuta el siguiente comando:
git merge nombre-rama
por ejemplo si se está sobre la rama master y se quiere mezclar la rama develop en master se ejecuta así:
git merge develop
En caso de que haya conflicto en la mezcla se debe solucionar archivo por archivo y hacer git add a cada archivo
git add archivo-con-conflicto-solucionado
git add otro-archivo-con-conflicto-solucionado
Luego hacer:
git merge --continue
Si se desea abortar se usa:
git merge --abort
Git es fácil de usar solo requiere un poco de práctica, es muy útil cuando se realiza un trabajo colaborativo con un equipo, hay una práctica que no se puede hacer muy fácil en la terminal y es saber que se cambió exactamente en un archivo, algunos editores (Sublime, Atom) tienen plugins que muestran que se ha cambiado en el código con algunos colores, también pueden instalar en linux una herramienta llamada Gitg, que permite hacer commits y revisiones de código, en Mac existe una llamada SmartGit.
Se que les será de gran utilidad este blog, hasta la próxima!