Idioma
Categoría
Buscar

Comprender el funcionamiento básico de Git y el uso de branches

Una introducción a Git: cómo implementarlo en un proyecto, definir configuraciones básicas, gestionar branches, ver historiales y tratar conflictos

En Terminal Por Rudi Drusian Lange
Publicado el
Última actualización

Sobre

Del manual: Git es un sistema de control de revisiones distribuido, rápido y escalable con un conjunto de comandos excepcionalmente rico que proporciona operaciones de alto nivel y acceso completo a los componentes internos. 

Ayuda

Para consultar el manual de Git, utilice man git. Hay dos formas de obtener más información sobre un comando específico como git log: man git-log o git help log.

Iniciar un proyecto

En primer lugar, es una buena práctica configurar el nombre y el correo electrónico que se utilizarán en los proyectos:

Shell

git config --global user.name "Tu Nombre Aquí"
git config --global user.email su@email.com

Suponiendo que el proyecto a administrar se encuentra en la carpeta mi-proyecto, inicie Git: 

cd mi-proyecto
git init

# Repositorio Git vacío iniciado en .git/
Initialized empty Git repository in .git/

Se ha creado un nuevo directorio .git/ dentro de la carpeta mi-proyecto. Luego, para hacer una copia del contenido completo de todos los archivos en el directorio actual, use:

# El punto '.' representa el directorio actual
git add .

El estado actual de los archivos se denomina snapshot, lo que significaría tomar una instantánea de los archivos. Con git add lo snapshot se guarda temporalmente en el índice, para que el contenido se almacene definitivamente usa: 

git commit

Commit inicial
# Please enter the commit message for your changes. Lines starting  # with '#' will be ignored, and an empty message aborts the commit. ...

Se le pedirá que ingrese un mensaje para definir este almacenamiento; en este ejemplo se utilizó Commit inicial. No escribir un mensaje cancela el proceso. Se utilizó el editor vi, Esc + i habilita la inserción de texto, luego de escribir el mensaje guardar y salir presionando Esc y luego escribiendo :wq (escribir y salir). 

También puede configurar el mensaje en la línea de comando usando -m:

git commit -m "Commit inicial"

Modifique algunos archivos, agregue el contenido actualizado al índice y ejecute commit. A continuación se muestran algunos comandos útiles para ayudar en el proceso. 

# Para agregar varios archivos al índice
git add archivo1 archivo2 archivo3

# Muestra cambios que no se han agregado al índice
git diff

# Muestra los cambios que ya están en el índice pero que aún no se han guardado
git diff --cached # Devuelve un resumen de la situación git status # Eliminar un archivo del índice git restore --staged nombre-del-archivo # Para guardar permanentemente git commit

Recuerde escribir el mensaje de commit, guardar y salir.

git commit -a

El comando anterior identificará cualquier modificación en archivos preexistentes, los agregará al índice y ejecutará el commit, todo al mismo tiempo. Los archivos nuevos serán ignorados.

Es una buena práctica utilizar la primera línea del mensaje de commit como título, algo que resuma el cambio que se realiza en menos de 50 caracteres. Deja una línea en blanco después del título y escribe un mensaje más detallado. El texto sobre la línea en blanco se considera el título y se usará en varias situaciones en el comando git.

Ejemplo: git format-patch convierte la confirmación en un correo electrónico, usa el título como asunto y el resto del texto como mensaje.

Historia del proyecto

El historial se puede consultar en cualquier momento mediante el comando git log.

# Historial de commit
git log

# Diferencia completa en cada paso
git log -p

# Resumen de cambios
git log --stat --summary

Gestionando ramas (Branches)

A continuación se analizará el uso de ramas o subdivisiones de un proyecto, el acto de iniciar y gestionar un nuevo proyecto basado en el original. En el comando se utiliza el término inglés branches y para referirse al proyecto inicial se utiliza master. Estos términos se utilizarán en inglés a lo largo de esta documentación para facilitar el aprendizaje.

Un único repositorio Git puede contener various branches de desarrollo.

# Creando una nuevo branch llamado experimental
git branch experimental

Enumerando branches, el asterisco marca lo branch actual:

git branch

  experimental 
* master

Cambiando a lo branch experimental

git switch experimental

Cambia a lo branch experimental con el comando de arriba, edite cualquier archivo y con los comandos de abajo haz commit y vuelve a lo branch master:

git commit -a
git switch master

Verifique que el cambio realizado en el archivo mientras estaba en lo branch experimental no esté presente en el master. Para unir lo branch experimental con lo branch master use el comando:

git merge experimental 

Al unir lo branch experimental con lo master, todos los cambios realizados en el archivo de lo branch experimental se agregarán a lo master. En este ejemplo anterior, los cambios solo se realizaron en el archivo de lo branch experimental.

Si se hicieran cambios en el mismo archivo en ambos branches, pero en líneas diferentes, al unir los branches se mantendrían ambos cambios.

Ejemplo práctico

Creemos el archivo proyecto.txt con el contenido a continuación y agréguelo a ambos branches:

# Cambiar a la rama maestra
git switch master      

# Crea el archivo proyecto.txt
vi proyecto.txt

proyecto.txt

1
2
3
# Agregar proyecto.txt al índice
git add proyecto.txt

# Guarde
git commit -a   

# Cambiar a lo branch experimental
git switch experimental  

# Combina todos los cambios realizados en el branch
# master incluida una copia del archivo proyecto.txt
git merge master

Al ejecutar commit, recuerde agregar una descripción, guardar y salir.

Agrega el número 0 a la primera línea del archivo proyecto.txt mientras estás en lo branch experimental y agrega el número 4 al final del mismo archivo pero estando en lo branch master.

vi proyecto.txt

proyecto.txt | branch experimental

0
1
2
3
git commit -a 
git switch master  
vi proyecto.txt

proyecto.txt | branch master

1
2
3
4
git commit -a
git merge experimental

Al unir lo branch experimental con lo master usando el comando anterior, el resultado será:

proyecto.txt | branch master

0
1
2
3
4

Vale recordar que en lo branch experimental el archivo continúa con el mismo contenido: 0,1,2,3.

Conflictos

Si se hicieran cambios en la misma línea tanto en lo branch master como en lo experimental, al usar el comando merge se mostraría un error de conflicto y el proceso se interrumpiría pidiendo una resolución. En este caso, Git no sabe cuál de los cambios conservar y, por tanto, necesita la intervención humana para resolver el conflicto.

Continuando con el ejemplo anterior, entra en lo branch experimental, añade -1 a la primera línea, commit, vuelve a lo branch master, añade +1 a la primera línea y commit.

Antes de unir los branches, veamos el aspecto actual de cada archivo:

proyecto.txt

# branch master     # branch experimental
+1                  -1
0                    0
1                    1
2                    2
3                    3
4

Unir:

git merge experimental
                                                                   
Auto-merging proyecto.txt CONFLICT (content): Merge conflict in proyecto.txt Automatic merge failed; fix conflicts and then commit the result.

Git diff mostrará este y otros conflictos existentes y se utiliza precisamente para este propósito.

git diff

Para corregir el conflicto usaremos el comando:

git mergetool

Este comando no necesariamente abrirá un editor para resolver el conflicto a menos que tenga instalada una de las opciones soportadas. En este ejemplo usaremos vimdiff, pero si tienes acceso a la interfaz gráfica puede ser una ventaja usar gvimdiff. Ejecute las siguientes configuraciones en Git:

# Establece vimdiff como predeterminado
git config merge.tool vimdiff
# Utilice el estilo diff3 para mostrar conflictos git config merge.conflictstyle diff3
# No pregunta qué editor utilizar git config mergetool.prompt false

Para más información sobre los comandos anteriores:

git help config mergetool 

# Lista de editores compatibles
git mergetool --tool-help

Resolver el conflicto:

git mergetool

vimdiff

╔═══════╦══════╦════════╗
║       ║      ║        ║
║ LOCAL ║ BASE ║ REMOTE ║
║       ║      ║        ║
╠═══════╩══════╩════════╣
║                       ║
║        MERGED         ║
║                       ║
╚═══════════════════════╝

Las cuatro visualizaciones son:

  • LOCAL: archivo de lo branch actual (master en nuestro ejemplo) 
  • BASE: versión anterior a los cambios, el ancestro común
  • REMOTE: archivo de lo branch que estamos combinando (experimental en nuestro ejemplo)
  • MERGED: este es el resultado de la combinación, que se utilizará al final

En vimdiff se utiliza el atajo Ctrl + W 2x para navegar entre ventanas. Utilice el comando :help window-moving dentro del editor para obtener más información sobre la navegación entre ventanas.

Para elegir la versión que desea utilizar, pulse Esc y, a continuación, escriba:

vimdiff

# Para utilizar el fichero BASE
:diffg BA
# Para utilizar el fichero LOCAL :diffg LO # Para utilizar el fichero REMOTE :diffg RE

Ahora guarda, cierra, commit y limpia:

# Guardar y cerrar vimdiff
Esc :wqa

# Commit
git commit -m "mensagem"

# Elimina los archivos adicionales (por ejemplo, *.orig)
# ¡Cuidadoso! Los archivos sin seguimiento serán eliminados
git clean -f

También puede editar el archivo combinado(merged) escribiendo un código nuevo y guardándolo en lugar de usar una de las versiones disponibles.

Histórico

El siguiente comando mostrará una bonita representación gráfica del historial de cambios. Aquí los mensajes utilizados para cada commit tendrán mejor sentido.

gitk

Eliminar un Branch

Llegados a este punto, lo branch experimental ha cumplido su propósito de modificar el proyecto sin comprometer la versión original y puede eliminarse mediante el comando:

git branch -d experimental

Este comando comprueba si los cambios de lo branch experimental ya se han aplicado antes de borrarlo. Si has desarrollado una mala idea y quieres descartar los cambios de este branch, utiliza:

git branch -D mala-idea

Conclusión

Usa y abusa de los branches, son fáciles y baratos :-), es una forma estupenda de probar algo diferente.

Este artículo se ha dividido en partes para que no sea demasiado largo y te desanime a seguir aprendiendo, puedes seguir aprendiendo sobre Git leyendo: Uso de Git para compartir y colaborar en un proyecto, que es la continuación de este artículo. 

Fuentes 

Este no es mi idioma original y no lo hablo muy bien. Utilicé mis pocos conocimientos y herramientas de traducción para redactar el texto de este artículo. Disculpe los posibles errores ortográficos o gramaticales, se agradecen sugerencias de correcciones y se pueden enviar al correo electrónico de contacto que se encuentra en el pie de página del sitio. Mi intención es compartir algunos conocimientos y espero que esta traducción sea lo suficientemente buena.