Remotes y GitHub


Hasta ahora, cada repositorio de este manual ha vivido en un solo lugar: tu propia máquina. Eso funciona bien hasta que quieres un respaldo que sobreviva si tu laptop muere, quieres seguir trabajando en el proyecto desde otra computadora, o quieres que alguien más pueda tocar el código. Lo que necesitas es una copia del repositorio guardada en algún lugar al que todas las máquinas involucradas puedan acceder. A esa copia se le llama remote, y GitHub es donde la mayoría de los desarrolladores la guardan.
Qué es un remote (y qué papel juega GitHub)
Un remote es una copia de tu repositorio alojada en algún lugar distinto de tu propia máquina, casi siempre en GitHub. Cuando clonas un repositorio, Git ya configura uno por ti, llamado origin por defecto. Ejecuta git remote -v (el -v pide también las URLs, además de los nombres) para verlo:
$ git remote -v
origin https://github.com/mara-chen/weather-app.git (fetch)
origin https://github.com/mara-chen/weather-app.git (push)Cada remote que Git conoce aparece listado dos veces, una para fetch y otra para push, porque en teoría podrían apuntar a direcciones distintas. En la práctica casi siempre es la misma. origin es el apodo que Git asigna automáticamente al clonar. Puedes renombrarlo o agregar un segundo remote que apunte a otro lugar, pero casi todos los proyectos con los que trabajes van a llamar origin a su remote principal.
Este es un buen momento para repetir la distinción que confunde a casi todos los que empiezan: Git y GitHub no son lo mismo. Git es la herramienta de control de versiones que corre en tu máquina, registrando commits sin importar si estás conectado a algo o no. GitHub es un sitio web que aloja una copia de tu repositorio y te da un remote al cual hacer push y desde el cual hacer pull. git remote, git push y git pull son los comandos que conectan ambos mundos: son la forma en que el Git de tu laptop se comunica con un repositorio que vive en los servidores de GitHub.
origin al que se crea por defecto. Ejecuta git remote -v en cualquier momento para ver qué remotes conoce tu repositorio. Git y GitHub no son lo mismo: Git es la herramienta en tu máquina, GitHub es donde suele vivir tu remote. Tener esa distinción clara desde el principio te ahorra mucha confusión más adelante. Dónde alojar tu remote: GitHub y las alternativas
Todo lo que hace un remote es Git puro y simple, y eso tiene una consecuencia que vale la pena conocer desde el principio: el proveedor del otro lado se puede cambiar. Para Git, cada proveedor es solo una URL en tu configuración, y git push, git pull y git fetch se comportan igual con todos ellos. Lo que un proveedor agrega está un nivel más arriba: una vista web de tu código, un flujo de revisión, seguimiento de issues y control de acceso. Aquí está el panorama, con las ventajas y desventajas dichas sin rodeos:
- GitHub es, por mucho, el más grande, y alberga la gran mayoría del trabajo open-source. Su fortaleza es la red: los proyectos a los que quieres contribuir ya están ahí, los tutoriales lo asumen, y los empleadores buscan tu perfil en él. La desventaja es que es una plataforma cerrada (propiedad de Microsoft), y cuanto más dependas de sus funciones extra más allá del alojamiento de Git, más atado quedas a ella.
- GitLab es la alternativa completa más cercana, con las mismas funciones principales bajo nombres un poco distintos (ahí los pull requests se llaman "merge requests"). Su punto fuerte es una edición autoalojada que puedes correr en tus propios servidores, razón por la cual las empresas que mantienen su código en casa suelen elegirla. La desventaja es que incluye muchísimas funciones, y la plataforma puede sentirse más pesada que el simple alojamiento de código que buscabas.
- Bitbucket es el proveedor de Atlassian, pensado para integrarse con sus herramientas de seguimiento de proyectos y documentación, Jira y Confluence. Si tu equipo ya vive en esas herramientas, encaja de inmediato. Fuera de ese ecosistema tiene la comunidad más pequeña de los tres grandes y poca presencia en open-source.
- Codeberg es un proveedor sin fines de lucro para proyectos open-source, que corre sobre la plataforma open-source Forgejo. Su atractivo es que ninguna empresa es dueña del proveedor y la plataforma misma es de código abierto. La desventaja es la escala: menos integraciones, una comunidad más pequeña, y un enfoque en open-source más que en trabajo privado de equipo.
- Autoalojamiento: es la base de todo lo anterior: puedes correr Forgejo o Gitea, ambos gratuitos y de código abierto, o la edición autoalojada de GitLab en hardware que tú controlas. Ganas control total y privacidad; la desventaja es que mantenerlo funcionando pasa a ser tu trabajo.
Este manual usa GitHub en sus ejemplos porque ahí se aloja la mayor parte del trabajo open-source y es donde más probablemente colabores por primera vez. Todos los comandos de este capítulo se aplican sin cambios a cualquier otro proveedor: cambia la URL y el ciclo diario de trabajo sigue siendo el mismo. Las diferencias están un nivel más arriba, en la interfaz web de cada sitio para revisar y fusionar trabajo, que es justo lo que veremos en el flujo de pull requests del próximo capítulo.
Enviar y traer tu trabajo: git push y git pull
Con un remote configurado, dos comandos cubren la mayor parte del trabajo diario. git push envía tus commits locales al remote. git pull trae los commits hechos en otro lado y los fusiona en la rama en la que estás.
$ git push origin main
Enumerating objects: 5, done.
Writing objects: 100% (3/3), 312 bytes | 312.00 KiB/s, done.
To https://github.com/mara-chen/weather-app.git
9f8e7d6..a1b2c3d main -> mainorigin es el remote, main es la rama que estás enviando. Esa última línea es la que vale la pena leer: muestra cómo main en el remote pasa de un commit al siguiente.
Hacer pull funciona igual, pero al revés:
$ git pull origin main
remote: Enumerating objects: 4, done.
Unpacking objects: 100% (4/4), done.
Updating a1b2c3d..b7c9e21
Fast-forward
src/index.js | 8 ++++++--
1 file changed, 6 insertions(+), 2 deletions(-)Ese es todo el ciclo para trabajar junto a otras personas en un mismo proyecto: traer con pull lo que haya cambiado antes de empezar, hacer tu propio trabajo y confirmarlo, y luego subirlo con push. Haz pull antes de hacer push siempre que compartas una rama con alguien más. Si te saltas el pull, tu push podría intentar aterrizar encima de commits que nunca viste, y Git se va a negar a hacerlo antes que arriesgarse a perder el trabajo de alguien.
git push envía tus commits al remote, y git pull trae los commits hechos en otro lado y los fusiona en tu rama. Haz pull antes de empezar a trabajar y push cuando termines, y así te mantienes sincronizado con cualquier otra persona que toque el proyecto. Saltarse el pull es la razón más común por la que un push es rechazado. git fetch vs git pull
git pull hace dos cosas en un solo paso: descarga lo que haya cambiado en el remote, y luego fusiona de inmediato esos cambios en la rama en la que estás. git fetch solo hace la primera mitad. Descarga los commits nuevos pero nunca los fusiona en tu rama. Tu rama actual, y tus archivos de trabajo, se quedan exactamente igual hasta que le pidas a Git que haga el merge o el pull.
Este es el tropiezo con el que casi todos se encuentran al menos una vez: ejecutas git fetch, no ves ningún cambio visible en ningún lado, y asumes que no pasó nada en el remote. Sí pasó algo: fetch todavía no ha tocado tu rama de trabajo. Para ver qué llegó, revisa la rama de seguimiento remoto de la que hablamos antes en este capítulo: git log origin/main muestra los commits que están en el remote y que todavía no han llegado a tu main local. Cuando estés listo para traerlos, git merge origin/main lo hace, o git pull ejecuta el fetch y ese merge por ti en un solo comando.
git pull descarga commits nuevos y los fusiona en tu rama en un solo paso. git fetch solo los descarga y actualiza lo que Git recuerda sobre el estado del remote; tu rama se queda igual hasta que hagas el merge. No ver ningún cambio en tus archivos justo después de un fetch es normal, los commits nuevos están esperando en la rama de seguimiento remoto. Hasta dónde llegas con esto
Push, pull y fetch llevan tus commits a un remote compartido y los traen de vuelta, y eso cubre la mayor parte de lo que exige la colaboración diaria en Git. Todo esto se apoya en el ciclo de commits: sigues haciendo stage y commit localmente primero, un remote solo cambia hasta dónde pueden viajar esos commits. La siguiente pieza es hacer esa colaboración a través de GitHub mismo, proponer un cambio y que sea revisado antes de fusionarse. El flujo de pull requests continúa justo desde ahí. Si algún término de este capítulo todavía se siente poco claro, rama de seguimiento remoto, refspec, upstream, el Glosario tiene una definición simple para cada uno, y Qué es Git vale la pena revisarlo de nuevo para la distinción entre Git y GitHub por sí sola.

