1. Git Internals: Best Practices, Tips & Tricks

Updated: Aug 2

Primera parte de la miniserie de Melt: Git Tricks, donde te enseñamos algunas cosas que quizás no conocías de Git 📝👀

Recopilamos para ti algunos tips útiles de Git! En este post aprenderás sobre cómo funciona Git internamente y así mismo, su componentes más importantes.


Resumamos rápidamente, ¿qué es?

Git es una herramienta Open Source de control de versiones, es decir, tendrás un registro de todas las modificaciones que hagas en los archivos que se encuentran dentro del árbol de carpetas del proyecto y hayan sido confirmadas con un commit. Podrás acceder a estas versiones cuando lo necesites y revertir o eliminar estos movimientos, además de otras funciones que te explicaremos más adelante.


Además, el historial de versiones es completo y fácil de acceder. Podemos movernos rápidamente a través de estos registros como si de una línea de tiempo por medio de un sistema de trabajo con ramas, las cuales pueden ayudarnos a crear proyecto con progresos diferentes a la rama principal donde está el core de nuestro desarrollo.



GIT TRICKS

TALK DE LA SEMANA



Lo indispensable

Recordarte que puedes instalar git en MacOS desde Homebrew:


brew install git

Necesitamos estar en una carpeta para iniciar. Dentro de nuestro editor de código, creamos el una carpeta llamada git_test, y comenzando desde este directorio vacío, inicializamos git:


git init 


Ahora, ¿Qué quiere decir inicializar un repositorio de Git? Git crea una carpeta .git que es el repositorio para nosotros. Contiene una serie de archivos y carpetas dentro donde guarda la configuración y cómo se gestiona nuestro proyecto.


Si existe algún error en el reproductor, puedes ver el video en el siguiente LINK.

​HEAD

Se refiere a la posición del commit en el que está tu repositorio, es decir, HEAD siempre es el último (más actual) commit de la rama actual

objects/

En esta carpeta Git organiza y almacena sus el archivo, el contenido del archivo y su árbol (ya les explicaremos de esto).

refs/

Donde Git almacena todas los remotes, etiquetas, ramas, commits, etc.


Git Config

En Git tenemos un archivo que nos sirve para personalizar el entorno de Git:


cat .git/config   

Y si trabajamos en un varios proyectos, es importante identificarnos donde cada repositorio tenga nuestra autoría o firma: git config, nos permite setear esta información de forma local, remota o global según queramos.


Si existe algún error en el reproductor, puedes ver el video en el siguiente LINK.


  • --system flag: lee y modifica en el archivo /etc/gitconfig, este contiene todos los usuarios del sistema y sus repositorios.

  • --global flag: Lee y modifica ~/.gitconfig o ~/.config/git/config, contiene sólo informació del usuario actual o tu usuario.

  • .git/config: Es el archivo de configuración sólo del repositorio actual



Git Internals

Revisemos la carpeta .git/objects/ con:


tree .git/  

Sin embargo aún está vacío, lo sabemos porque el árbol de objects no muestra nada.

.git
└── objects
|
...

Una vez creemos un archivo dentro de nuestro repositorio, deberemos agregarlo con:


git add <filename>

Y volvemos a ejecutar


tree .git/

ℹ️ Nota: En Mac puedes instalar el comando tree con Homebrew: brew install tree

Y verás algo así:


.git
└── objects
|   └─ 0f
|   |   └─ 0dae56...
|   └─ 9f
|   |   └─ d51eba...
|   └─ info
|   └─ pack
...

Este primer objeto que agregamos haciendo el git add a un archivo, es un "blob" file. Estos blob almacenan solo el contenido, es decir si creamos un archivo README.md el cual contenga el texto Esto es un readme nuestro blob nos muestra su contenido “Esto es un readme”.


Vamos a probarlo, escribimos:


git cat-file -p 0f0dae56... 
> Esto es un readme

ℹ️ Nota: En Git, el hash de un objeto es un número hexadecimal único de 40 caracteres. Se toman los primeros 2 caracteres como nombre de directorio, y el resto como nombre de archivo 📝

También podemos pedir el tipo con el flag -t:


git cat-file -t 0f0dae5...
> blob

Mira los siguientes ejemplos:

Si existe algún error en el reproductor, puedes ver el video en el siguiente LINK.

blobs

Sólo guarda el contenido de un archivo. (No tiene Metadata a diferencia del file)

tree

Enumera el contenido de un directorio, conecta "blobs" con nombres y refs. Es equivalente a un directorio

commits

Almacena una referencia a una versión específica del código, tiene toda la información sobre el repositorio en ese momento

También contiene una referencia a el objeto tree porque la primera carpeta es un directorio y los objetos de árbol también se utilizan para almacenar referencias a directorios.

ℹ️ Nota: Si tuviéramos que modificar el contenido de README.md, la referencia del archivo blob también sería diferente.

Aunque los comandos nos facilitan los procesos, es importante conocer lo que ocurre bajo nivel. Dentro de un repositorio Git, los tipos de contenido, es decir: blobs, árboles y commits; son objetos creados bajo un hash SHA-1, y con esta especie de id podemos realizar operaciones entre ellos dependiendo de sus caraterísticas:


Blobs

Son como "archivos", pero no. Como vimos anteriormente, un blob es el contenido de los objetos de git, y se almacena sin registrar fecha, autor u otros metadatos. Y pesan cerca de 20bytes.


Tree

Un árbol en git es donde se almacenan nuestros objetos, por lo que si revisamos alguno, encontraremos una lista de directorios y/o blobs dentro. Además el hash SHA-1 cambia si alguno de los objetos dentro de él es modificado (a diferencia de los blobs).



Commit

Una vez los cambios estén en el stage, debemos confirmarlos y para esto hacemos un commit. Pero no sabemos cómo funciona, resulta que es la instantánea de tu trabajo y siempre apunta al árbol. Trae metadata como el momento en que se confirma (fecha, tiempo), el mensaje y el autor.



Sigamos ahora con el ciclo de vida de Git, cómo funcionan sus estados y cómo se publican los cambios. No te preocupes si es mucha información, la hemos simplificado muy bien y continuaremos en el siguiente post: Git Life Cycle: Best Practices, Tips & Tricks 📌


_________________________________________________________________________________________


¡Gracias por leer!


📍 Conéctate con nosotros en instagram👇


539 views

Join our newsletter to receive information about latest technologies trends and job offers

Thanks for subscribing!