Imagina esta situación...
Piensa en versiones que heredan de un mismo proyecto...
Una por cada colaborador
... o una por propósito
... como un árbol con un tronco y sus ramas
Beneficios de trabajar con branches (ramas)
1. Crear la rama y luego moverse a ella (usando dos comandos):
git branch <nombre_rama>
git checkout <nombre_rama>Ejemplo:
2. Crear y moverse a la rama con un solo comando:
git checkout -b <nombre_rama>Ejemplo:
a. Obtener una lista con los nombres de las ramas existentes:
git branch --listEjemplo:
b. Eliminar ramas:
git branch --delete <nombre_rama>Ejemplo:
Sí, pero... ¡sería un gran pandemonio! 😱
Trunk-based development
Un flujo de trabajo para cada estilo de desarrollo
Git-flow
Todos los desarrolladores trabajan sobre una sola rama y tienen completo acceso a ella. Pueden crear ramas de corta vida que luego fusionan con la principal.
Agiliza el desarrollo.
Se está comenzando.
Se requiere iterar rápidamente.
Trabajas con un gran número de desarrolladores senior.
Ideal cuando:
Una rama principal: master o main.
Varias ramas adicionales: develop, release, hotfix, feature, etc.
Gestionas proyectos open-source.
Cuentas con varios desarrolladores juniors.
Dispones de un producto establecido.
Ideal cuando:
Estructura básica del comando:
tipo/descripcion-breve-IDBuenas prácticas
✅ Usar guiones para separar palabras.
✅ Todo en minúsculas.
✅ Ser descriptivo pero conciso.
✅ Si se trata de un ticket, incluir ID.
Conviene evitar:
❌ camelCase o PascalCase.
❌ Espacios en blanco.
❌ Nombres muy largos.
❌ Caracteres especiales y acentos.
Se recomienda:
Ejemplos:
feature/mercadopago-integration
bugfix/login-validation-#445
hotfix/security-patch-v2
release/v2.1.0
docs/api-documentationAlgunos tipos comunes:
feature/ : nuevas característicasbugfix/ : correcciones no urgenteshotfix/ : correcciones urgentesrelease/ : preparación de versionesdocs/ : documentación
test/ : pruebasfeature/bugfix/hotfix/release/docs/test/¡Fusión!
git rebase
git merge
Combina los cambios de ambas ramas.
Trabajas en equipo.
Hay ramas compartidas.
La trazabilidad es importante.
Es ideal usarlo cuando:
Estructura básica del comando:
git checkout <rama-destino>
git merge <rama-origen>Ejemplo:
Mueve o "replanta" los commits de una rama a un nuevo punto base.
Trabajas localmente con ramas privadas.
Antes de hacer un Pull Request.
Es ideal usarlo cuando:
Estructura básica del comando:
git checkout <rama-destino>
git rebase <rama-origen>Ejemplo:
✋Nunca hagas git rebase de commits públicos✋
Fuente de imagen: Giphy
Permite elegir commits de una rama por su referencia y añadirlos al HEAD actual de trabajo.
⚠️ Genera commits duplicados ⚠️
Fuente de imagen: Giphy
1. Buscar el commit que se quiere traer a la rama:
git log --oneline <nombre_rama>3. Pegar el hash copiado del paso anterior en el siguiente comando:
git cherry-pick <hash-commit>2. Del listado, copiar el hash (compuesto por siete caracteres)
b91eec0 mensaje - commit 4
2cd08fb mensaje - commit 3
cc1ba37 mensaje - commit 2
defd04e mensaje - commit 1Ejemplo:
Buscar el commit en el listado y copiar su hash.
Pegar el hash en el comando git cherry-pick:
* Como puede observarse en las capturas, d452c19 y 166b876 son distintos hashes del mismo commit
Permite almacenar temporalmente los cambios cuando necesitas moverte rápidamente a otra rama/contexto para trabajar en otra cosa.
Fuente de imagen: Giphy
a. Guardar el trabajo actual en un stash:
git stashb. Recuperar el último stash:
git stash popc. Ver lista de stashes:
git stash listEn la práctica se vería de la siguiente manera:
Combina varios commits en uno solo.
Se utiliza cuando se han realizado varios commits pequeños para una característica o corrección de errores.
Fuente de imagen: Pinterest
a. Usando git rebase interactivo, e indicando un rango de commits:
git rebase -i <commits-a-unificar>git merge --squash <nombre-rama>b. Usando git merge:
Ejemplo con git rebase -i
Se puede hacer un squash de los tres commits más recientes:
git rebase -i HEAD~3Ejemplo con git merge --squash
Se puede hacer un squash de una rama en particular:
git merge --squash <nombre-rama>Mueve el puntero HEAD y la rama actual a un commit específico.
Tiene tres modos: --soft, --mixed, --hard
Fuente de imagen: Giphy
Deshacer el último commit, manteniendo cambios en el área staging:
git reset --soft HEAD~1Ejemplos prácticos para cada modo
Deshacer el último commit y remover cambios del área staging:
git reset HEAD~1* El modo --mixed está configurado por defecto
Deshacer cambios del último commit y eliminar todo (¡CUIDADO con este comando!):
git reset --hard HEAD~1Crea un nuevo commit que deshace cambios de commits anteriores.
Fuente de imagen: Ion Litio
Revertir el último commit:
git revert HEADEjemplos prácticos
git revert 8be4b22Revertir un commit específico:
* Recordatorio: para extraer la versión corta del hash, ejecutar git log --oneline
Restaura archivos del directorio de trabajo o del área staging. No modifica commits ni el historial.
Fuente de imagen: Pinterest
Descartar cambios en un archivo (directorio de trabajo):
git restore archivo.pyEjemplos prácticos
git restore --staged archivo.pyRestaurar archivo a una versión específica:
git restore --source=HEAD~1 archivo.pyDescartar cambios en un archivo (área de staging):
1. Ver archivos en conflicto:
git status<<<<<<< HEAD
def compile_model(model):
return model.compile(loss="binary_crossentropy")
=======
def compile_model(model):
return model.compile(
loss="binary_crossentropy",
optimizer="adam",
metrics=["accuracy", "roc_auc", "f1_score"]
)
>>>>>>> feature/model-compile2. Identificar marcadores en el archivo:
3. Resolver el conflicto desde el mismo código o desde la terminal.
a. Aceptar cambios entrantes:
Opciones de resolución (desde la terminal)
git checkout --theirs <path/archivo/con/conflicto>b. Mantener versión actual:
git checkout --ours <path/archivo/con/conflicto>c. Crear una solución combinada, editando manualmente y luego commitear:
git add <path-archivo>
git commit -m "merge: mensaje de referencia"a. Si intentabas hacer un git pull/push:
git push origin <nombre-rama>
git pull origin <nombre-rama>b. Si estabas fusionando ramas:
git merge --continue4. Continuar con el proceso que se interrumpió debido al conflicto.
c. Si estabas realizando un squash:
git merge --squash <nombre-rama>Ejemplo:
1. Leer el mensaje:
git statusOpciones que ofrece git rebase
git rebase --continuea. Después de resolver el conflicto:
git rebase --abortgit rebase --skip b. Cancelar el rebase:
c. Saltar el commit problemático:
1. Leer los mensajes de Git:
git status # Muestra si hay archivos en conflicto
git diff --check # Verifica existencia de conflictos2. Usar herramientas visuales (si está configurado):
git mergetools3. Prevenir conflictos verificando diferencias entre ramas:
git diff <nombre-rama-1>...<nombre-rama-2>Resolver el conflicto...
... y luego, retomar el merge de las ramas.
Crear un PR:
Reglas de protección de ramas:
Métricas y análisis:
Network graph
Métricas de uso de GH Actions
Colaboración avanzada:
Tablero de proyectos
Discussions
Otras funcionalidades: GitHub Pages
GitHub Actions es una plataforma de automatización que permite crear flujos de trabajo personalizado (workflows) directamente en el repositorio.
Estos workflows se activan por eventos de GitHub (push, pull request o de forma programada).
Pueden ejecutar una serie de tareas automatizadas como pruebas, despliegues, o cualquier proceso de CI/CD.
Se definen en archivos YAML dentro del directorio de .github/workflows.
Aplicaremos algunos de los conceptos vistos de Git y de GitHub en un proyecto ficticio.
Demo