Capítulo 12 de 33 9 secciones 7 min

Qué es GitHub y qué no

La diferencia entre el programa de tu máquina y la página web

<strong>Git es un programa que corre en tu computadora y no necesita internet. GitHub es una página web donde puedes dejar una copia de tu repositorio.</strong> Puedes usar Git toda tu vida sin abrir GitHub, y de hecho los once capítulos anteriores fueron eso. Lo que conecta los dos es una sola línea, <code>git remote add origin</code>, que le dice a tu repositorio dónde vive la copia de allá.

La pregunta que más me hacen no es cómo usar Git. Es esta, tal cual la recibí en LinkedIn: "he visto varios desarrollos compartidos en GitHub pero todavía me cuesta entender cómo instalarlos y cómo aprovecharlos".

Y la respuesta empieza por deshacer una confusión, porque casi todo el mundo llega pensando que Git y GitHub son la misma cosa con dos nombres 🙃

El programa y la página

Piensa en tu teléfono. La cámara es un programa que funciona sin internet: tomas fotos, las miras, las borras. Google Fotos es un sitio donde dejas una copia para tenerlas a salvo y para compartirlas.

Git es la cámara. GitHub es Google Fotos.

GitGitHub
Qué esUn programa en tu máquinaUna página web
InternetNo hace falta
Quién lo hizoLinus Torvalds, 2005Una empresa, hoy de Microsoft
Para qué sirveGuardar la historia de tu proyectoTener una copia fuera y compartirla
Se puede cambiarNo hay otro GitGitLab, Bitbucket, Codeberg

Esa última fila importa más de lo que parece: tu repositorio no está atado a GitHub. Es una carpeta con una carpeta oculta dentro, y la puedes copiar a donde quieras 🧳

Un repositorio no sabe que GitHub existe

Vamos a armar el proyecto de ventas otra vez, como en el capítulo 3, y a preguntarle si conoce a alguien:

mkdir ventas-miss-yera
cd ventas-miss-yera
git init -q
printf 'ciudad,monto\nLima,1200\nArequipa,890\n' > ventas.csv
git add ventas.csv
git commit -q -m "Primeras ventas de Lima y Arequipa"
git remote -v
echo "(arriba no salió nada, y eso es lo normal)"
(arriba no salió nada, y eso es lo normal)

git remote -v lista los sitios de fuera que este repositorio conoce. No salió nada porque no conoce ninguno: es un proyecto perfectamente sano que vive solo en tu máquina 🏠

Qué pasa si intentas subirlo así

git push
fatal: No configured push destination.
Either specify the URL from the command-line or configure a remote repository using

    git remote add <name> <url>

and then push using the remote name

    git push <name>

"No configured push destination" es Git diciéndote "¿subirlo a dónde?". No es un error tuyo, es una pregunta sin respuesta.

Presentarle un remoto

Un remoto es una dirección con un apodo. El apodo casi siempre es origin, por costumbre, y podría ser cualquier cosa.

Con una cuenta de GitHub, la línea de verdad se ve así:

git remote add origin git@github.com:tuusuario/ventas-miss-yera.git

Para practicar sin cuenta y sin internet vamos a hacer algo que además te enseña qué es GitHub por dentro: un servidor de práctica en tu propia máquina. Es una carpeta con la historia y sin archivos a la vista, que es exactamente lo que GitHub guarda de tu proyecto.

cd ..
git init -q --bare servidor-de-practica.git
cd ventas-miss-yera
git remote add origin ../servidor-de-practica.git
git remote -v
origin	../servidor-de-practica.git (fetch)
origin	../servidor-de-practica.git (push)

Sale dos veces, una para traer (fetch) y otra para llevar (push), porque en teoría podrían ser direcciones distintas. En la práctica nunca lo son 🤝

Y ahora sí, subirlo

git push -u origin main
To ../servidor-de-practica.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

Ese -u se escribe una sola vez en la vida del proyecto. Lo que hace es dejar apuntado que tu rama main de aquí se corresponde con la main de allá, y desde entonces basta con escribir git push a secas.

Fíjate en algo importante: tu commit no cambió. Subir no crea nada nuevo, copia lo que ya existía. El hash de allá y el de aquí son el mismo 🪞

git log --oneline
git ls-remote origin
2a3fc36 Primeras ventas de Lima y Arequipa
2a3fc36beb5c2a9e53847d7ea23f4af29abc0159	HEAD
2a3fc36beb5c2a9e53847d7ea23f4af29abc0159	refs/heads/main

Lo que GitHub añade y Git no tiene

Si GitHub solo fuera una copia, no sería gran cosa. Lo que añade encima es la parte social, y esa parte no existe en Git:

  • Issues, para pedir ayuda o reportar que algo no funciona.
  • Pull requests, para proponer un cambio en el proyecto de otra persona.
  • Actions, para que se ejecuten cosas solas cuando subes.
  • Releases, para marcar "esta es la versión que la gente debe descargar".
  • El perfil, las estrellas y todo lo que hace que un proyecto se encuentre.

Cuando alguien te dice "está en GitHub", casi siempre quiere decir "hay un repositorio de Git ahí, y encima de él hay una conversación" 💬

La trampa

Subes por fin tu proyecto de ventas a GitHub, le das a crear repositorio sin mirar mucho y publicas. Al día siguiente te escribe un desconocido preguntando por el cliente de Arequipa.

$ git push -u origin main

Enumerating objects: 12, done.
To github.com:tuusuario/ventas-miss-yera.git
 * [new branch]      main -> main
Qué está mal

El repositorio quedó público y el CSV con los clientes también 👀

GitHub te pregunta público o privado una sola vez, en la pantalla de crear, y viene marcado público por defecto. Nadie te lo vuelve a preguntar y el push no dice ni una palabra al respecto.

Público en GitHub no es "poco visible": es indexable por Google y rastreable por robots que buscan justo esto. Un repositorio con montos, nombres de bodegas y correos es un problema de datos personales, no un descuido.

Se puede cambiar a privado después, en Settings, pero lo que ya se copió no vuelve. La costumbre: privado primero, público cuando decidas que sí.

Comprueba que se entendió

Comprueba que lo tienes

Se cae internet toda la mañana. ¿Qué puedes seguir haciendo con tu repositorio?

  • Nada, Git necesita conexión
  • Todo menos subir y bajar
  • Solo mirar, no puedo guardar
  • Solo si antes hice push

Ejercicios

1. Pregunta a quién conoce

Crea el repositorio del catálogo de bodegas y lista sus remotos antes de configurar ninguno.

cd ..
mkdir catalogo-bodegas
cd catalogo-bodegas
git init -q
printf 'bodega,ciudad\nBodega Inti,Cusco\n' > bodegas.csv
git add bodegas.csv
git commit -q -m "Catalogo inicial de bodegas"
git remote -v
echo "sin remotos, todo normal"
sin remotos, todo normal

Un repositorio recién creado no conoce a nadie, y puede vivir así para siempre.

2. Móntale su servidor de práctica

Crea el repositorio vacío que hará de GitHub y conéctalo con el apodo origin.

cd ..
git init -q --bare bodegas-servidor.git
cd catalogo-bodegas
git remote add origin ../bodegas-servidor.git
git remote -v
origin	../bodegas-servidor.git (fetch)
origin	../bodegas-servidor.git (push)

Dos líneas con el mismo apodo: una para traer y otra para llevar.

3. Sube el catálogo

Manda la rama main al servidor y deja la correspondencia apuntada.

git push -u origin main
To ../bodegas-servidor.git
 * [new branch]      main -> main
branch 'main' set up to track 'origin/main'.

El -u es el que hace que a partir de ahora baste git push a secas.

4. Comprueba que allá está lo mismo

Compara el hash de tu último commit con el que tiene el servidor.

git log --oneline -1
git ls-remote origin main
a9874ae Catalogo inicial de bodegas
a9874ae5ade9ebff480ec9f29629b1b651573849	refs/heads/main

El mismo hash de los dos lados. Subir copia, no transforma 🪞

5. Sube un cambio más

Agrega un minimarket de Trujillo y súbelo, ya sin escribir el destino.

printf 'Minimarket Sol,Trujillo\n' >> bodegas.csv
git add bodegas.csv
git commit -q -m "Entra el minimarket de Trujillo"
git push
To ../bodegas-servidor.git
   a9874ae..4cb519a  main -> main

Sin origin main detrás, porque ya quedó apuntado.

6. Cámbiale el apodo al remoto

Renombra origin a github y comprueba que sigue funcionando igual.

git remote rename origin github
git remote -v
git push github main
github	../bodegas-servidor.git (fetch)
github	../bodegas-servidor.git (push)
Everything up-to-date

origin es solo una costumbre. Al proyecto le da lo mismo cómo se llame 🏷️

7. Desconéctalo del todo

Quita el remoto y comprueba que el repositorio sigue entero.

git remote remove github
git remote -v
git log --oneline
4cb519a Entra el minimarket de Trujillo
a9874ae Catalogo inicial de bodegas

Quitar el remoto no toca ni un commit. Tu historia siempre fue tuya y sigue completa 🧷

Lo que te llevas

Git guarda tu historia; GitHub guarda una copia y le pone conversación encima. Lo que conecta los dos es una sola línea.

Practica este capítulo 📓

Todo el código de arriba en un cuaderno que corre de principio a fin, y los ejercicios con una celda vacía para que los hagas tú. Se abre en Google Colab y no hay que instalar nada.

¿Tienes alguna duda o consulta?