Git avanzado: comandos y flujos de trabajo que todo dev debería conocer
En el mundo del desarrollo de software, Git es una herramienta esencial que todos debemos dominar. Si bien la mayoría de los desarrolladores están familiarizados con los comandos básicos, hay un conjunto de comandos avanzados y flujos de trabajo que pueden llevar tu productividad al siguiente nivel. En este artículo, vamos a explorar algunos de estos comandos y estrategias de branching que todo dev debería conocer. Así que ponete cómodo, y vamos a sumergirnos en el fascinante mundo de Git avanzado.
Rebase Interactivo
El rebase interactivo es una de las herramientas más poderosas de Git. Te permite reescribir la historia de tu branch de forma controlada, lo cual es útil para limpiar commits, reorganizar, editar mensajes y más. En RHINO, usamos el rebase interactivo para mantener la historia de commits limpia y comprensible.
Por ejemplo, supongamos que tenés una serie de commits que querés reorganizar o modificar. Podés iniciar un rebase interactivo con el siguiente comando:
git rebase -i HEAD~3
Este comando abrirá una interfaz en tu editor de texto preferido, mostrando los últimos tres commits. Podés cambiar las palabras clave al lado de cada commit para realizar acciones como 'pick', 'reword', 'edit', 'squash', etc.
Tip: Usá rebase interactivo para combinar commits menores en uno solo antes de mergear a la rama principal. Esto hace que la historia sea más fácil de seguir.
Cherry-Pick
El cherry-pick es un comando que te permite aplicar un commit específico de una branch a otra. Imaginá que en Menteo AI hubo un bug crítico que resolviste en una branch de feature, pero necesitás aplicar esa solución también en la rama de producción.
Podés hacer esto fácilmente con cherry-pick:
git checkout master
git cherry-pick <commit-hash>
Es crucial verificar que el commit que estás cherry-pickeando no cause conflictos en la rama de destino. Si surgen conflictos, Git te pedirá que los resuelvas manualmente antes de completar el proceso.
Pro: Permite aplicar soluciones específicas sin necesidad de mergear toda una branch. Con: Puede complicar la historia si se usa en exceso.
Git Bisect
Git bisect es una herramienta increíble para encontrar qué commit introdujo un bug. En Merchant Hub Akua, nos enfrentamos a un problema donde una funcionalidad dejó de funcionar después de una serie de cambios. En lugar de revisar manualmente cada commit, usamos bisect para automatizar el proceso.
El flujo de trabajo básico es el siguiente:
git bisect start
git bisect bad <final-bad-commit>
git bisect good <last-known-good-commit>
Git bisect dividirá el rango de commits en dos y te llevará al commit intermedio. Podés entonces probar si el bug está presente. Dependiendo del resultado, indicás a Git si el commit es bueno o malo:
git bisect good
git bisect bad
Git continuará con el proceso hasta encontrar el commit exacto que introdujo el bug. Esto ahorra un tiempo increíble en debugging.
Reflog
Reflog es como una red de seguridad. Te permite ver todos los movimientos de tu HEAD, incluso si esos commits ya no están referenciados en ninguna branch. Esto es útil cuando accidentalmente resetás o eliminás commits.
Para ver el historial de movimientos de tu HEAD, simplemente usá:
git reflog
Si encontrás un commit perdido, podés recuperarlo utilizando:
git checkout <commit-hash>
Esto es particularmente útil para revertir operaciones destructivas como un 'reset hard'. En RHINO, reflog nos ha salvado más de una vez cuando accidentalmente eliminamos cambios importantes.
Stash Avanzado
Muchos desarrolladores usan 'git stash' para guardar cambios temporales, pero hay más en el stash que solo eso. Por ejemplo, podés aplicar stashes selectivamente o incluso guardarlos con un mensaje.
Para guardar un stash con un mensaje, usá:
git stash push -m "Trabajo en progreso en la feature X"
Para aplicar un stash específico, podés listar todos los stashes y luego aplicarlos:
git stash list
git stash apply stash@{2}
Esto es ideal cuando tenés múltiples stashes y necesitás aplicar uno específico. Además, podés crear branches desde un stash guardado, lo cual es útil si decidís que los cambios temporales son lo suficientemente importantes como para convertirse en una feature branch.
Worktrees
Los worktrees te permiten trabajar en múltiples ramas al mismo tiempo sin necesidad de clonar de nuevo el repositorio. Esto es especialmente útil cuando estás en medio de una tarea urgente y necesitás cambiar rápidamente de contexto.
Para crear un nuevo worktree, ejecutá:
git worktree add ../nueva-rama feature-branch
Esto creará una nueva carpeta con la branch especificada. Podés cambiar entre diferentes ramas y worktrees sin perder el contexto de tu trabajo actual.
En Menteo AI, esta funcionalidad nos ha permitido trabajar en múltiples hotfixes y features simultáneamente sin perder tiempo en cambiar de branch y reconstruir el entorno.
Estrategias de Branching: Git Flow vs Trunk Based
Existen diferentes estrategias de branching, y la elección de una sobre otra depende de la naturaleza de tu proyecto. Dos de las más populares son Git Flow y Trunk Based Development.
Git Flow
Git Flow es una estrategia que introduce ramas para cada etapa del ciclo de desarrollo: master, develop, feature, release, y hotfix. Esta estructura es ideal para proyectos con ciclos de release bien definidos.
El flujo básico es crear una branch de feature desde develop, trabajar en los cambios, y luego mergear de vuelta a develop. Cuando se está listo para una release, se crea una branch de release que finalmente se mergea en master y develop.
Pros: Estructura clara con ramas dedicadas para cada propósito. Contras: Puede ser excesivo para equipos pequeños o proyectos con releases continuos.
Trunk Based Development
Trunk Based Development se centra en mantener una única rama principal (trunk o master) y realizar integraciones frecuentes. Las feature branches son de corta duración y se mergean rápidamente en el trunk.
Esta estrategia es ideal para entornos de desarrollo continuo y despliegue continuo (CI/CD), como lo hemos implementado en Merchant Hub Akua.
Pros: Reduce la complejidad de merge y facilita la integración continua. Contras: Requiere disciplina y herramientas de CI bien configuradas para evitar conflictos frecuentes.
Conclusión
Dominar estos comandos avanzados y comprender las diferentes estrategias de branching puede transformar significativamente tu flujo de trabajo en Git. Desde rebase interactivo hasta worktrees, cada herramienta tiene su lugar en el arsenal de un desarrollador experimentado. Espero que esta guía te haya proporcionado nuevas perspectivas y herramientas para mejorar tu productividad con Git. Si tenés alguna pregunta o querés compartir tus propias experiencias, no dudes en contactame. ¡Buena codificación!