Data Team MICGit es el sistema de control de versiones distribuido más utilizado. Permite gestionar repositorios con convenciones de branching y commit estandarizadas.
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
# 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
$ git init nombre-proyecto
$ cd nombre-proyecto
$ git remote add origin [email protected]:equipo/nombre-proyecto.git
$ git push -u origin main
| 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 |
# 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"
# 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
--amendsi el commit NO fue pusheado al remoto.
# 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
| 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 reverten vez degit reset --hardpara commits que ya estan en GitLab.
# 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}
| 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 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 -
# Locales
$ git branch
# Remotas
$ git branch -r
# Todas con upstream
$ git branch -vv
# Ramas mergeadas a main
$ git branch --merged main
# 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
mainydevelopse hacen via Merge Request (MR) en GitLab, nunca con push directo.
# 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 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
# 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 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>
# 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
# 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>
# 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
Aplicar un commit especifico a la rama actual:
$ git cherry-pick <hash>
# Sin commitear (solo traer cambios)
$ git cherry-pick --no-commit <hash>
<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"
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
Crear rama desde develop:
$ git checkout develop
$ git pull origin develop
$ git checkout -b feature/mi-feature
Desarrollar y commitear:
$ git add .
$ git commit -m "feat: descripcion del cambio"
Subir rama y crear MR:
$ git push -u origin feature/mi-feature
Luego en GitLab: Create Merge Request → asignar reviewer → esperar aprobacion.
Despues del merge, limpiar:
$ git checkout develop
$ git pull origin develop
$ git branch -d feature/mi-feature
# 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/
$ 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"