Ramas: trabajar en paralelo sin romper nada
Una rama te deja probar una idea o desarrollar una función nueva aparte de la versión principal. Cuando está lista, la unís; si no sirvió, la borrás. Es la forma normal de trabajar con Git, aunque estés solo.
Términos de esta página
Las bases (commit, HEAD) están en Conceptos.
- Rama (branch)
- Un marcador con nombre que apunta a un commit y avanza solo cuando hacés commits nuevos estando en ella.
- main
- La rama principal por convención: la versión “buena” del proyecto.
- Rama de función
- Una rama corta para una sola tarea (feature branch), por ejemplo
agrega-login. Se une amainy se borra. - Merge
- Unir los commits de una rama dentro de otra.
- Fast-forward
- Un merge en el que la rama destino solo “avanza” hasta la otra, porque no tenía commits propios. No crea commit nuevo.
- Commit de merge
- Un commit especial con dos padres que se crea cuando las dos ramas avanzaron por separado.
- Conflicto
- Cuando las dos ramas cambiaron las mismas líneas de un archivo y Git no puede decidir solo cuál dejar. Te pide que elijas vos.
- Rebase
- Mover tus commits para que queden encima de otra rama, como si hubieras empezado desde ahí. Deja un historial en línea recta.
- switch / checkout
- Cambiar de rama.
git switches el comando moderno;git checkoutes el viejo y hace muchas cosas más (por eso confunde).
Qué es una rama
Una rama no es una copia de los archivos: es solo un nombre que apunta a un commit. Por eso crearla es instantáneo. Cuando cambiás de rama, Git reemplaza los archivos de tu carpeta por los de esa rama. Cuando volvés, vuelven los otros.
En el dibujo, main siguió con el commit C mientras en nueva-ruta se hicieron D y E. Las dos líneas comparten A y B, y cada una tiene lo suyo. HEAD marca en cuál estás (acá, en nueva-ruta).
Crear, cambiar y borrar ramas
Crear y cambiar
git switch -c nueva-rutanueva-ruta a partir del commit actual y se cambia a ella (-c = create). Es lo que vas a usar casi siempre.git switch maingit switch -En tutoriales viejos vas a ver git checkout -b nueva-ruta y git checkout main: hacen lo mismo.
Ver, renombrar y borrar
git branch*. Con -v muestra además el último commit de cada una.git branch -afetch; aparecen como remotes/origin/nombre. Para trabajar en una de ellas, git switch nombre crea la rama local conectada.git branch -m nombre-nuevo-m = move). Si ya la habías subido, en GitHub sigue con el nombre viejo: subí la nueva con git push -u origin nombre-nuevo y borrá la vieja allá.git branch -d nueva-ruta-D la borra igual (se pierden esos commits).git push origin --delete nueva-rutaorigin). git branch -d solo borra la copia de tu PC; para quitarla de los dos lados, hacen falta los dos comandos.Cambios sin commitear al cambiar de rama: si tus cambios no chocan con la otra rama, viajan con vos. Si chocan, Git no te deja cambiar (“Your local changes would be overwritten”). Commiteá primero o guardalos con git stash.
Unir ramas (merge)
Para traer el trabajo de nueva-ruta a main: te parás en la rama que recibe los cambios y le decís qué rama unir.
git switch main
git pull
git merge nueva-rutanueva-ruta dentro de main.git push
git branch -d nueva-rutagit push sube a GitHub el main con la rama ya unida. Después, git branch -d borra la rama local: sus commits ya forman parte de main, así que no se pierde nada.Qué podés ver al hacer merge
- “Fast-forward”:
mainno tenía commits nuevos; solo avanzó. Listo. - Se abre el editor con “Merge branch 'nueva-ruta'”: las dos ramas avanzaron y Git crea un commit de merge. Guardá y cerrá el editor para aceptar el mensaje.
- “CONFLICT”: las dos ramas cambiaron las mismas líneas. Seguí la sección siguiente.
Resolver un conflicto, paso a paso
No es un error grave: Git solo necesita que decidas qué versión queda.
1. Qué ves
Auto-merging app.js
CONFLICT (content): Merge conflict in app.js
Automatic merge failed; fix conflicts and then commit the result.
Git unió todo lo que pudo y dejó marcadas, dentro del archivo, las partes en conflicto:
<<<<<<< HEAD
const PORT = 3000;
=======
const PORT = process.env.PORT ?? 8080;
>>>>>>> nueva-ruta
- Entre
<<<<<<< HEADy=======: lo que tenía tu rama actual (main). - Entre
=======y>>>>>>> nueva-ruta: lo que traía la otra rama.
2. Cómo resolverlo
- Corré
git status: los archivos en conflicto aparecen como both modified. - Abrí cada archivo y dejá el código como tiene que quedar: una de las dos versiones, las dos o una mezcla. Borrá las tres líneas de marcas (
<<<,===,>>>). - En VS Code aparecen botones arriba del conflicto: Accept Current (lo tuyo), Accept Incoming (lo de la otra rama), Accept Both (ambos).
- Marcá cada archivo como resuelto:
git add app.js. - Terminá el merge:
git commit(Git propone el mensaje; guardá y cerrá el editor).
git merge --abortPara tener menos conflictos: ramas cortas, git pull seguido y commits chicos.
Rebase: la alternativa al merge
rebase toma los commits de tu rama y los “vuelve a aplicar” encima del último commit de otra. El resultado es el mismo código, pero el historial queda en línea recta, sin commits de merge. Los commits movidos son commits nuevos (cambia su hash): D y E pasan a ser D′ y E′.
git switch mi-rama
git rebase mainmi-rama encima de lo último de main. Si hay conflictos, se resuelven como en un merge, pero se continúa con git rebase --continue (o se cancela con git rebase --abort).git pull --rebaseLa regla de oro
No hagas rebase de commits que ya subiste a una rama que usan otras personas. Como el rebase crea commits nuevos, los demás tendrían un historial distinto al tuyo y se arma un lío.
Si tenés dudas, usá merge: siempre es seguro. El rebase es una preferencia de prolijidad, no una obligación.
Un flujo de trabajo con ramas
El que usan la mayoría de los equipos (y que conviene usar solo también).
- Partí de
mainactualizado:git switch mainygit pull. - Creá una rama por tarea:
git switch -c agrega-health. - Trabajá y commiteá en esa rama todas las veces que quieras.
- Subila:
git push -u origin agrega-health(la primera vez con-u). - En GitHub, abrí un Pull Request de
agrega-healthhaciamainpara revisar los cambios (ver GitHub y remotos). - Cuando está aprobado, se hace el merge en GitHub (botón Merge pull request).
- En tu PC:
git switch main,git pullygit branch -d agrega-health.
Con este flujo, main siempre tiene código que funciona, y si algo sale mal en una rama no afecta a nadie más. Además, si conectaste el repo a Netlify, cada merge a main publica el sitio solo.
No encontré resultados.