Por qué el rebase interactivo
El rebase interactivo reescribe una secuencia de commits en una historia más limpia y significativa antes de publicar. Es el instrumento quirúrgico de Git: puedes reordenar, editar, hacer squash, fixup, descartar, reescribir o dividir commits, todo en una sola sesión guiada. Dominarlo transforma una rama local desordenada en una historia que los revisores pueden seguir.
La lista de tareas
Ejecutar git rebase -i abre un editor con una lista de tareas. Cada línea tiene un verbo y un commit. Reordena las líneas para reordenar los commits. Cambia los verbos para cambiar el comportamiento.
git rebase -i HEAD~5
Los verbos incluyen pick (usar commit), reword (editar solo el mensaje), edit (detenerse para enmendar), squash (combinar con el anterior, conservar ambos mensajes), fixup (combinar, descartar el mensaje), drop (eliminar) y exec (ejecutar un comando shell entre commits). Dos verbos más recientes son break (pausar incondicionalmente) y label/reset/merge para el grafo de merge del rebase (desde Git 2.18).
Dividir un commit
Marca el commit con edit, luego deshaz y vuelve a hacer commit:
git reset HEAD^
git add -p
git commit -m "Primer cambio lógico"
git add -p
git commit -m "Segundo cambio lógico"
git rebase --continue
Flujo de autosquash
Cuando detectas un error tipográfico en un commit anterior, crea un commit fixup y deja que rebase los ordene automáticamente:
git commit --fixup=<sha>
git rebase -i --autosquash HEAD~10
Configura rebase.autoSquash = true para que sea el predeterminado. Combínalo con rebase.autoStash = true para que los árboles de trabajo sucios no bloqueen el rebase.
Exec para verificación
Usa líneas exec para verificar que cada commit compila y los tests pasan — invaluable para mantener una historia bisectable:
git rebase -i --exec "cargo test" main
Cada commit entre HEAD y main será revisado y se ejecutará el comando. Si falla, rebase se detiene para que puedas arreglar y continuar.
Rebase de merges con --rebase-merges
El rebase tradicional aplana los merges. Pasa --rebase-merges para preservar la topología:
git rebase -i --rebase-merges main
Errores comunes
Hacer rebase de commits publicados obliga a los colaboradores a cirugía de historia. Reserva el rebase interactivo para ramas que solo tú posees, o coordina explícitamente. Olvidar git rebase --continue tras resolver conflictos deja el rebase a medio aplicar. Usa git status — te dice exactamente qué hacer. Finalmente, si destruyes trabajo, git reflog casi siempre lo rescata.
Recuperación
Si un rebase sale mal, aborta y empieza de nuevo:
git rebase --abort
git reflog
git reset --hard HEAD@{5}