Tema 23: Elegir entre rebase y merge
Merge y rebase pueden llegar a archivos finales parecidos y dejar historias distintas. Elegir no consiste en buscar un comando ganador: depende de qué información quieres conservar y de si otras personas utilizan ya esos commits.
Merge incorpora otra línea conservando los commits originales. Si hay divergencia, añade un commit con dos padres que representa el encuentro. Si no la hay, puede avanzar directamente, como en el tema 14. La opción --no-ff solicita conservar un punto de integración.
Rebase reproduce los cambios y obtiene nuevos identificadores. Puede facilitar leer una secuencia continua de trabajo local sobre una base actualizada. A cambio, cambia la identidad de los commits reproducidos y no conserva un commit de integración por sí mismo.
| Situación | Decisión de esta práctica |
|---|---|
| Trabajo local todavía no compartido que quieres ordenar | Rebase puede ser apropiado |
| Rama que varias personas ya utilizan | Conservar su historia mediante merge |
| Necesitas ver dónde se integró otra línea | Commit de merge |
En el laboratorio, copia y feature/saludo empiezan con el mismo trabajo. Integra main en copia con merge y reorganiza feature/saludo sobre main con rebase. log --graph --all permite comparar: una línea conserva un encuentro de dos padres y la otra los commits reproducidos.
En ambos casos revisa el resultado y resuelve conflictos si aparecen. Un historial recto no garantiza un programa correcto, y un historial con ramas no significa que el trabajo esté mal organizado. Sigue la convención del proyecto y coordina cualquier reescritura de versiones compartidas.
Comandos para probar #
1git switch copia 2git merge main 3git switch feature/saludo 4git rebase main 5git log --oneline --graph --all
Error que conviene evitar #
Usar rebase para arreglar la estética de una rama que ya están utilizando otras personas sin acordarlo con ellas.
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
Compara dos historiales
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 · copia
- 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
- Añade un punto de unión con dos padres.
- La nueva base forma parte de los datos de los commits.
- Úsala junto con --graph para comparar caminos.
- Usar rebase para arreglar la estética de una rama que ya están utilizando otras personas sin acordarlo con ellas.