Git avanzado
Guía para comandos más allá del día a día. Git tiene herramientas poderosas que, aunque no uses constantemente, pueden salvarte cuando las necesitas.
Rebase interactivo
git rebase -i te permite reescribir el historial de commits antes de hacer merge. Útil para limpiar commits pequeños o mal nombrados antes de compartirlos.
git rebase -i HEAD~3Se abre un editor con los últimos 3 commits:
pick a1b2c3d feat: añadir login
pick e4f5g6h fix: algo roto
pick i7j8k9l docs: update readme
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the message
# s, squash = use commit, but meld into previous one
# f, fixup = like squash, but discard this commit's message
# d, drop = remove commitCombinar commits (squash):
pick a1b2c3d feat: añadir login
squash e4f5g6h fix: algo roto
pick i7j8k9l docs: update readmeEsto combina los dos primeros commits en uno solo.
⚠️ Atención: nunca hagas rebase de commits que ya están en una rama compartida (como
main). Solo rebase en ramas tuyas.
Git Bisect: encontrar el commit que rompió todo
Si tienes un bug que no sabes cuándo apareció, bisect hace búsqueda binaria en el historial:
git bisect start
git bisect bad HEAD # El commit actual tiene el bug
git bisect good a1b2c3d # Este commit funcionaba bienGit te lleva a un commit intermedio. Tests y decides si funciona o no:
git bisect good # Si funciona, marca como "good"
git bisect bad # Si no funciona, marca como "bad"Git reduce el rango hasta encontrar el commit exacto. En ~10 pasos máximo.
git bisect reset # Terminar y volver a HEADStash avanzado
git stash guarda cambios temporalmente sin commitearlos.
Stash básico
git stash
git stash pop # Recuperar cambiosStash con nombre
git stash push -m "WIP: login feature sin terminar"
git stash list # Ver todos los stashesStash parcial
Guardar solo algunos archivos o incluso líneas específicas dentro de un archivo:
git stash -p # Modo interactivo: archivo por archivo, hunk por hunkTe pregunta para cada cambio:
y - stash this hunk
n - don't stash this hunk
q - quitCrear rama desde un stash
git stash branch nueva-rama stash@{0}Reflog: recuperar commits "perdidos"
Hiciste git reset --hard y perdiste cambios? No todo está perdido.
git reflogSalida:
a1b2c3d HEAD@{0}: reset: moving to HEAD~3
e4f5g6h HEAD@{1}: commit: feat: añadir login
i7j8k9l HEAD@{2}: checkout: moving to mainEl commit sigue ahí, solo el puntero de HEAD se movió. Para recuperarlo:
git checkout e4f5g6h # Ir al commit "perdido"
git checkout -b recover # O crear una rama desde élCherry-pick: aplicar un commit específico
Quieres un commit de otra rama, pero no quieres hacer merge de toda la rama:
git cherry-pick a1b2c3dEsto aplica solo ese commit específico sobre tu rama actual.
Útil para:
- Recuperar un fix que hiciste en otra rama
- Aplicar hotfixes específicos sin afectar otros cambios
Submódulos: cuándo (y cuándo no) usarlos
Los submódulos permiten tener un repositorio dentro de otro:
git submodule add https://github.com/usuario/biblioteca libs/bibliotecaCuándo usarlos:
- Librerías externas que se actualizan independientemente
- Documentación que vive en su propio repo
Cuándo NO usarlos:
- Para dependencias de proyecto → usa un package manager (npm, pip, maven)
- Cuando los "submódulos" cambian constantemente → el overhead no vale la pena
Alternativas modernas:
- npm/pip/maven para código compilado
- Monorepo si necesitas mantener múltiples paquetes relacionados
Comandos de diagnóstico
git blame archivo.js # Ver quién cambió cada línea
git show a1b2c3d # Ver el contenido de un commit
git log -p archivo.js # Historial de cambios en un archivo
git gc # Limpiar objetos innecesarios
git fsck # Verificar integridad del repositorioAlias útiles
git config --global alias.st "status -s"
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.lg "log --oneline --graph --all"Después:
git lg # Ver historial visualGit avanzado no es sobre memorize más comandos—es sobre entender el modelo de objetos de Git para poder recover cuando algo sale mal.
Más guías en mmoreno.dev.