Git avanzado: los comandos que todo desarrollador debería conocer
Tiempo de lectura: 8 minutos Categoría: Programación · Herramientas Nivel: Intermedio
Todo el mundo conoce git add, git commit y git push. Pero Git es una herramienta enormemente poderosa y la mayoría de desarrolladores solo usa el 20% de sus capacidades. En este artículo te explico los comandos y técnicas avanzadas que marcan la diferencia entre un uso básico y un dominio real de Git.
Git stash: guarda cambios sin commitear
Estás trabajando en una funcionalidad a medio terminar y de repente necesitas cambiar de rama para revisar algo urgente. No quieres hacer un commit a medias pero tampoco quieres perder tus cambios. Git stash es la solución.
El comando git stash guarda todos tus cambios no commiteados en una pila temporal y deja el directorio de trabajo limpio. Puedes cambiar de rama, hacer lo que necesitas, y luego volver y recuperar tus cambios con git stash pop.
Con git stash list ves todos los stashes guardados. Puedes tener varios stashes y aplicarlos selectivamente con git stash apply seguido del identificador. Con git stash drop eliminas un stash específico y con git stash clear limpias todos.
Una opción muy útil es git stash push -m con un mensaje descriptivo para recordar qué contiene cada stash cuando tienes varios acumulados.
Git rebase: historial limpio
El merge es la forma más común de integrar cambios de una rama en otra, pero deja un historial lleno de commits de merge que pueden dificultar la lectura. El rebase es una alternativa que reescribe el historial para que parezca que los commits se hicieron directamente sobre la rama destino.
La regla de oro del rebase es nunca hacer rebase de ramas que ya han sido compartidas con otros desarrolladores. Reescribir el historial de commits que otros ya tienen en sus repositorios locales crea conflictos muy difíciles de resolver.
El rebase interactivo con git rebase -i es especialmente potente. Te permite reorganizar commits, combinar varios commits en uno con squash, editar mensajes de commits anteriores, eliminar commits y dividir un commit en varios. Todo esto te permite presentar un historial limpio y coherente aunque el proceso de desarrollo haya sido más caótico.
Git cherry-pick: trae commits específicos
A veces necesitas traer un commit específico de otra rama sin hacer merge de toda la rama. Git cherry-pick hace exactamente eso: aplica los cambios de un commit específico en la rama actual.
Usa git log para encontrar el hash del commit que quieres y luego git cherry-pick seguido del hash. Si hay conflictos los resuelves igual que en un merge.
Cherry-pick es muy útil para backports, cuando necesitas aplicar un bugfix a una rama de producción antigua sin traer todas las funcionalidades nuevas de la rama principal.
Git bisect: encuentra el commit que introdujo un bug
Tienes un bug en producción. Sabes que hace dos semanas el código funcionaba bien pero ahora está roto. ¿Cuál de los 200 commits intermedios introdujo el problema? Git bisect hace una búsqueda binaria entre los commits para encontrarlo.
Inicias la bisección con git bisect start, marcas el commit actual como malo con git bisect bad y un commit anterior donde funcionaba como bueno con git bisect good seguido del hash o tag. Git automáticamente hace checkout de un commit intermedio y tú le dices si es bueno o malo. Repites esto hasta que Git identifica el commit exacto que introdujo el problema.
Puedes automatizar el proceso si tienes un test que falla con el bug: git bisect run seguido del comando de test hace la búsqueda completamente automática.
Git reflog: el historial de todo
El reflog es el registro de todos los movimientos de HEAD en tu repositorio. Es como una red de seguridad: incluye commits que hayas perdido con un reset, ramas eliminadas y cualquier otra operación que normalmente sería irreversible.
Con git reflog ves todos los movimientos de HEAD con sus hashes. Si accidentalmente hiciste un reset y perdiste commits puedes recuperarlos encontrando el hash en el reflog y haciendo git checkout o git branch para crear una rama desde ese punto.
El reflog se limpia automáticamente después de 90 días por defecto, así que no es una solución permanente pero cubre la mayoría de errores accidentales.
Git worktree: múltiples directorios de trabajo
Normalmente para trabajar en dos ramas simultáneamente tienes que cambiar entre ellas o clonar el repositorio dos veces. Git worktree te permite tener múltiples directorios de trabajo del mismo repositorio en paralelo, cada uno apuntando a una rama diferente.
Con git worktree add seguido de la ruta y el nombre de la rama creas un nuevo directorio que funciona como un clon ligero del repositorio. Puedes trabajar en ambos directorios simultáneamente y todos comparten el mismo repositorio Git, así que no tienes que sincronizar nada.
Alias de Git para ser más productivo
Git permite definir alias para comandos largos o que uses con frecuencia. Con git config --global alias seguido del nombre del alias y el comando puedes crear atajos propios.
Algunos alias muy populares son un log con formato gráfico y coloreado que muestra el historial de ramas de forma visual, un shortcut para el status abreviado, y aliases para stash pop y rebase interactivo.
.gitignore global
Además del .gitignore por repositorio puedes configurar un .gitignore global que aplica a todos tus repositorios. Esto es perfecto para ignorar archivos específicos de tu sistema operativo o editor como .DS_Store en macOS, los archivos de configuración de tu IDE o los archivos de entornos virtuales de Python.
Configúralo con git config --global core.excludesfile seguido de la ruta al archivo de gitignore global.
Conclusión
Git es una herramienta con mucha más profundidad de la que aparenta. Conocer estos comandos te permite trabajar de forma más eficiente, mantener un historial limpio y salir de situaciones que de otra forma parecerían sin solución.
La próxima vez que cometas un error en Git, antes de entrar en pánico recuerda que el reflog probablemente tiene lo que necesitas.
¿Cuál es el comando de Git que más te ha salvado de un desastre? Los comentarios son vuestros.

