Tema 22: Reproducir commits con rebase
Un rebase reproduce los cambios de una línea sobre otra base. Por ejemplo, si trabajas en feature/saludo y main avanzó, git rebase main intenta colocar tus commits después de los de main. Se ejecuta desde la rama cuyo trabajo quieres reorganizar.
Los commits originales tenían otros padres. Al reproducirlos cambia esa relación y se crean identificadores nuevos. main conserva su referencia; la rama de trabajo termina señalando el último commit reproducido. El resultado puede ser una línea continua sin un nuevo commit de merge.
Antes de empezar, deja limpio el trabajo. El laboratorio muestra el historial anterior y posterior, y mantiene los commits antiguos para que puedas comparar. Que sigan visibles en el modelo no significa que debas publicar ambos conjuntos.
Rebase aplica los cambios uno a uno. Si uno no encaja, se detiene. Edita la resolución, revisa diff, prepara con add y ejecuta git rebase --continue. Puede haber más de una parada si otros commits también necesitan una decisión. No sustituyas esta continuación por un commit normal durante la práctica.
git rebase --abort cancela la operación y recupera la rama y los archivos de antes de empezar. Los retos usan un estado limpio para que esa recuperación sea clara. En un conflicto de rebase, las etiquetas de las propuestas pueden resultar menos intuitivas que en merge: lee el contenido y su base en lugar de elegir solo por el nombre «nuestra» u «otra».
Practica rebase sobre commits locales que aún no has compartido. Reproducir versiones que otras personas ya usan cambia los identificadores sobre los que están trabajando. La comparación del siguiente tema te ayudará a elegir cuándo conservar y cuándo reorganizar la historia.
Comandos para probar #
1git switch feature/saludo 2git status 3git rebase main 4git log --oneline --graph --all 5git status
Error que conviene evitar #
Reorganizar una rama compartida sin coordinarse o continuar antes de preparar todos los conflictos. Rebase reproduce commits, no los mueve intactos.
Laboratorio local #
Prueba los comandos y observa qué cambia. Puedes reiniciar sin guardar una entrega. Los retos evaluables y el cuestionario están en las actividades de este tema.
Git / práctica local
Reproduce tu trabajo
Aplicar edición cambia el archivo; git add lo prepara.
Historial de commits
Las líneas conectan los commits con sus padres. Los commits que ya no tienen una referencia también permanecen visibles en este laboratorio.
- 0000004: Actualiza título; main
- 0000003: Añade pie; HEAD → feature/saludo
- 0000002: Prepara documento;
- 0000001: Commit inicial;
Comparar trabajo, índice y HEAD
Trabajo
Título inicial Centro Pie de feature
Índice (staging)
Título inicial Centro Pie de feature
HEAD
Título inicial Centro Pie de feature
TERMINAL
Sesión local preparada. Escribe help para consultar los comandos de este tema.
Comandos disponibles y límites
git --version · git config --global <clave> [valor] git init · git status git add <archivo | .> · git commit -m "mensaje" · git log git log --oneline · git switch <rama> (antes: checkout) git restore [--staged] <archivo> · git commit --amend [-m "mensaje" | --no-edit] git switch --detach <commit> · HEAD · HEAD~1 git diff [--staged | <commit> <commit>] git remote [-v] · git remote add <nombre> <URL> · git remote get-url <nombre> · git remote set-url <nombre> <URL> git clone <URL> git push [-u] <remoto> <rama> ssh-keygen -t ed25519 · ssh -T git@github.com (ficticios) git branch [nombre] · git branch -m <nombre> · git branch -d <rama> · git switch -c <rama> git merge [--ff-only] <rama> git merge --no-ff <rama> · git log --graph --all --decorate git merge --abort · editar conflicto, git add y git commit -m "mensaje" git config --global alias.st status · git st git tag [nombre] · git tag -a <nombre> -m "mensaje" · git tag -n · git push origin <tag> git reset --soft|--mixed|--hard <commit> · git reflog git stash push [-u] [-m "mensaje"] · list · show · apply · pop · drop git rebase <rama> · git rebase --continue · git rebase --abort help · clear
Sesión en memoria: recargar descarta la práctica. Doscientas acciones como máximo. Dos archivos editables de hasta 250 líneas. Diez ramas como máximo. Diez entradas de stash como máximo. El modelo no ejecuta comandos reales ni realiza conexiones externas. diff muestra contenido anterior y posterior por archivo.
Resumen
- Se crean nuevas versiones con relaciones de padres diferentes.
- El commit resultante no es el mismo objeto que el original.
- La operación retoma la reproducción de commits.
- Reorganizar una rama compartida sin coordinarse o continuar antes de preparar todos los conflictos. Rebase reproduce commits, no los mueve intactos.