DataSkills Hub

Git

Git es el sistema de control de versiones distribuido más utilizado. Permite gestionar repositorios con convenciones de branching y commit estandarizadas.

#Getting Started

#Configurar identidad

Configurar tu nombre y correo para todos los repos:

$ git config --global user.name "Nombre Apellido"
$ git config --global user.email "[email protected]"

Verificar configuracion actual:

$ git config --list

#Clonar un repo desde GitLab

# Via SSH (recomendado)
$ git clone [email protected]:equipo/proyecto.git

# Via HTTPS
$ git clone https://gitlab.example.com/equipo/proyecto.git

Clonar en un directorio especifico:

$ git clone [email protected]:equipo/proyecto.git mi-carpeta

#Crear un repositorio nuevo

$ git init nombre-proyecto
$ cd nombre-proyecto
$ git remote add origin [email protected]:equipo/nombre-proyecto.git
$ git push -u origin main

#Estado y diferencias

Comando Descripcion
git status Archivos modificados, staged y untracked
git diff Cambios no staged
git diff --staged Cambios staged listos para commit
git diff HEAD Todos los cambios vs ultimo commit

#Operaciones Diarias

#Agregar y confirmar cambios

# Agregar archivo especifico
$ git add archivo.py

# Agregar todos los cambios
$ git add .

# Commit con mensaje convencional (ver Convenciones)
$ git commit -m "feat: agregar validacion de campos en formulario"

#Modificar ultimo commit

# Cambiar solo el mensaje
$ git commit --amend -m "fix: corregir typo en validacion"

# Agregar archivos olvidados sin cambiar mensaje
$ git add archivo_olvidado.py
$ git commit --amend --no-edit

Solo usar --amend si el commit NO fue pusheado al remoto.

#Sincronizar con GitLab

# Traer cambios del remoto
$ git fetch origin

# Traer y mergear rama actual
$ git pull origin main

# Pull con rebase (preferido para historial limpio)
$ git pull --rebase origin main

# Subir cambios
$ git push origin mi-rama

# Subir rama nueva y crear tracking
$ git push -u origin feature/nueva-funcionalidad

Configurar rebase por defecto en pulls:

$ git config --global pull.rebase true

#Deshacer cambios

Accion Comando
Descartar cambios en archivo (no staged) git restore archivo.py
Quitar archivo del stage git restore --staged archivo.py
Revertir todo al ultimo commit git reset --hard HEAD
Deshacer ultimo commit (mantener cambios) git reset --soft HEAD~1
Revertir commit ya pusheado git revert <hash>

Usar git revert en vez de git reset --hard para commits que ya estan en GitLab.

#Stash: guardar trabajo temporal

# Guardar cambios en stash
$ git stash

# Guardar con descripcion
$ git stash push -m "WIP: refactor del parser"

# Listar stashes
$ git stash list

# Recuperar ultimo stash
$ git stash pop

# Aplicar sin eliminar del stash
$ git stash apply stash@{0}

# Descartar stash
$ git stash drop stash@{0}

#Branches y Merge

#Estrategia de branching

Rama Proposito Protegida
main Produccion estable Si
develop Integracion de features Si
feature/* Desarrollo de funcionalidades No
fix/* Correccion de bugs No
hotfix/* Parches urgentes en produccion No
release/* Preparacion de release No

#Crear y cambiar de rama

# Crear rama desde main
$ git checkout -b feature/nombre-descriptivo

# Equivalente moderno
$ git switch -c feature/nombre-descriptivo

# Cambiar a rama existente
$ git checkout develop
$ git switch develop

# Volver a la rama anterior
$ git checkout -

#Listar ramas

# Locales
$ git branch

# Remotas
$ git branch -r

# Todas con upstream
$ git branch -vv

# Ramas mergeadas a main
$ git branch --merged main

#Merge y Merge Request (MR)

# Mergear feature a develop (local)
$ git checkout develop
$ git merge feature/mi-feature

# Merge sin fast-forward (conserva historial de rama)
$ git merge --no-ff feature/mi-feature

Los merges a main y develop se hacen via Merge Request (MR) en GitLab, nunca con push directo.

#Rebase

# Actualizar feature con cambios de develop
$ git checkout feature/mi-feature
$ git rebase develop

# Rebase interactivo (reordenar/squash commits)
$ git rebase -i HEAD~3

Nunca hacer rebase de ramas compartidas (main, develop).

#Eliminar ramas

# Eliminar rama local (ya mergeada)
$ git branch -d feature/mi-feature

# Forzar eliminacion local
$ git branch -D feature/mi-feature

# Eliminar rama remota
$ git push origin --delete feature/mi-feature

# Limpiar referencias remotas obsoletas
$ git fetch --prune

#Historial y Navegacion

#Ver historial

# Log basico
$ git log

# Log compacto (una linea por commit)
$ git log --oneline

# Log con grafico de ramas
$ git log --oneline --graph --decorate --all

# Ultimos N commits
$ git log -5

# Commits de un autor
$ git log --author="nombre"

# Commits en rango de fechas
$ git log --after="2026-01-01" --before="2026-03-14"

#Buscar en el historial

# Buscar por mensaje de commit
$ git log --grep="feat:"

# Buscar por contenido cambiado
$ git log -S "nombre_funcion"

# Historial de un archivo especifico
$ git log --follow -p archivo.py

# Archivos modificados en un commit
$ git log --name-only -1 <hash>

#Inspeccionar un commit

# Ver detalle de un commit
$ git show <hash>

# Ver solo archivos cambiados
$ git show --stat <hash>

# Ver diff entre dos ramas
$ git diff develop...feature/mi-feature

#Reflog: recuperar trabajo perdido

# Ver historial de movimientos de HEAD
$ git reflog

# Restaurar a un estado anterior
$ git checkout <hash-del-reflog>

# Crear rama desde estado recuperado
$ git checkout -b recovery/mi-trabajo <hash>

#Tags para releases

# Crear tag anotado (preferido)
$ git tag -a v1.2.0 -m "Release 1.2.0: nuevas metricas de churn"

# Listar tags
$ git tag -l

# Subir tags al remoto
$ git push origin --tags

# Subir un tag especifico
$ git push origin v1.2.0

#Cherry-pick

Aplicar un commit especifico a la rama actual:

$ git cherry-pick <hash>

# Sin commitear (solo traer cambios)
$ git cherry-pick --no-commit <hash>

#Convenciones

#Formato de commits (Conventional Commits)

<tipo>(<scope>): <descripcion corta>

[cuerpo opcional]

[footer: referencia a issue]
Tipo Uso
feat Nueva funcionalidad
fix Correccion de bug
docs Solo documentacion
style Formato, sin cambios de logica
refactor Reestructuracion sin cambiar comportamiento
test Agregar o corregir tests
chore Mantenimiento, deps, CI
perf Mejora de rendimiento

Ejemplo:

$ git commit -m "feat(etl): agregar validacion de nulos en pipeline de churn"

#Nombrado de ramas

feature/descripcion-corta
fix/descripcion-del-bug
hotfix/parche-urgente
release/v1.2.0

Ejemplos reales:

feature/dashboard-metricas-arpu
fix/timeout-en-query-redshift
hotfix/corregir-calculo-churn
release/v2.0.0

#Flujo de Merge Request (MR)

  1. Crear rama desde develop:

    $ git checkout develop
    $ git pull origin develop
    $ git checkout -b feature/mi-feature
    
  2. Desarrollar y commitear:

    $ git add .
    $ git commit -m "feat: descripcion del cambio"
    
  3. Subir rama y crear MR:

    $ git push -u origin feature/mi-feature
    

    Luego en GitLab: Create Merge Request → asignar reviewer → esperar aprobacion.

  4. Despues del merge, limpiar:

    $ git checkout develop
    $ git pull origin develop
    $ git branch -d feature/mi-feature
    

#.gitignore esencial

# Entornos virtuales
.venv/
venv/
env/

# Variables de entorno
.env
.env.local

# IDE
.idea/
.vscode/
*.swp

# Python
__pycache__/
*.pyc
*.egg-info/

# Datos y modelos (no versionar en git)
data/raw/
*.csv
*.parquet
models/*.pkl

# OS
.DS_Store
Thumbs.db

# Build artifacts
dist/
build/
node_modules/

#Aliases recomendados

$ git config --global alias.st "status -sb"
$ git config --global alias.lg "log --oneline --graph --decorate --all"
$ git config --global alias.co "checkout"
$ git config --global alias.br "branch -vv"
$ git config --global alias.last "log -1 HEAD --stat"
$ git config --global alias.undo "reset --soft HEAD~1"