Comandos de Git

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.

Qué es Git?

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:

branch or rama

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.

Plataformas de desarrollo colaborativo (alojamiento de repositorios)

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.

Instalación

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"

Comandos Básicos

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

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.

Git status

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

git status muestra el branch actual (master), cambios en el stage (preparados para hacer un commit, se explica mas adelante) y los modificados.

Git add

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

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 add -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'

Git commit --amend

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

Git push

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

Git pull

Comando usado para descargar cambios de un alojamiento de repositorios al proyecto en el computador, pueden ser por ejemplo cambios realizados por otro desarrollador.

git pull origin nombre-de-la-rama


Ejemplo:

git pull origin master

Git stash

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

Git checkout

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

git branch muestra la rama actual:

git branch

También se usa para eliminar una rama así:

git branch -D nombre-rama

Git log

Comando usado para ver el histórico de commits realizados en la rama actual

git log

Ejemplo:

git log

Cada commit es identificado con un hash, como pueden ver aparece el autor, la fecha y la descripción que tiene el commit.

Comandos avanzados

Comandos que representan un mayor cuidado pero fáciles de usar

Git reset

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

Git pull --rebase

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

Git merge

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!

Autor: Jhon J Valero R  

Ingeniero de Software en Elemental Lab

Tweet