{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Qué es GitHub y qué no\n",
    "\n",
    "La diferencia entre el programa de tu máquina y la página web\n",
    "\n",
    "Cuaderno de práctica del capítulo 12 de **Git desde cero**, de Miss Yera.\n",
    "\n",
    "Corre de arriba abajo. Si lo abres en Google Colab no necesitas instalar nada.\n",
    "\n",
    "Capítulo completo: https://missyera.com/guias/git-desde-cero/que-es-github/\n",
    "\n",
    "Los ejercicios están al final y traen una celda vacía debajo de cada uno. Las\n",
    "respuestas viven en el cuaderno de soluciones, y merece la pena pelearse un\n",
    "rato antes de abrirlo 💛"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La pregunta que más me hacen no es cómo usar Git. Es esta, tal cual la\n",
    "recibí en LinkedIn: *\"he visto varios desarrollos compartidos en GitHub pero\n",
    "todavía me cuesta entender cómo instalarlos y cómo aprovecharlos\"*.\n",
    "\n",
    "Y la respuesta empieza por deshacer una confusión, porque casi todo el mundo\n",
    "llega pensando que Git y GitHub son la misma cosa con dos nombres 🙃"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El programa y la página"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Piensa en tu teléfono. La cámara es un programa que funciona sin internet:\n",
    "tomas fotos, las miras, las borras. Google Fotos es un sitio donde dejas una\n",
    "copia para tenerlas a salvo y para compartirlas.\n",
    "\n",
    "Git es la cámara. GitHub es Google Fotos."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "|  | Git | GitHub |\n",
    "|---|---|---|\n",
    "| Qué es | Un programa en tu máquina | Una página web |\n",
    "| Internet | No hace falta | Sí |\n",
    "| Quién lo hizo | Linus Torvalds, 2005 | Una empresa, hoy de Microsoft |\n",
    "| Para qué sirve | Guardar la historia de tu proyecto | Tener una copia fuera y compartirla |\n",
    "| Se puede cambiar | No hay otro Git | GitLab, Bitbucket, Codeberg |"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Esa última fila importa más de lo que parece: tu repositorio no está atado a\n",
    "GitHub. Es una carpeta con una carpeta oculta dentro, y la puedes copiar a\n",
    "donde quieras 🧳"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Un repositorio no sabe que GitHub existe"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Vamos a armar el proyecto de ventas otra vez, como en el capítulo\n",
    "3, y a preguntarle si conoce a alguien:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "mkdir ventas-miss-yera\n",
    "cd ventas-miss-yera\n",
    "git init -q\n",
    "printf 'ciudad,monto\\nLima,1200\\nArequipa,890\\n' > ventas.csv\n",
    "git add ventas.csv\n",
    "git commit -q -m \"Primeras ventas de Lima y Arequipa\"\n",
    "git remote -v\n",
    "echo \"(arriba no salió nada, y eso es lo normal)\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "`git remote -v` lista los sitios de fuera que este repositorio\n",
    "conoce. No salió nada porque no conoce ninguno: es un proyecto perfectamente\n",
    "sano que vive solo en tu máquina 🏠"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qué pasa si intentas subirlo así"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "git push"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "fatal: No configured push destination.\n",
    "Either specify the URL from the command-line or configure a remote repository using\n",
    "\n",
    "    git remote add <name> <url>\n",
    "\n",
    "and then push using the remote name\n",
    "\n",
    "    git push <name>\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "\"No configured push destination\" es Git diciéndote *\"¿subirlo a dónde?\"*.\n",
    "No es un error tuyo, es una pregunta sin respuesta."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Presentarle un remoto"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un **remoto** es una dirección con un apodo. El apodo casi\n",
    "siempre es `origin`, por costumbre, y podría ser cualquier cosa.\n",
    "\n",
    "Con una cuenta de GitHub, la línea de verdad se ve así:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "git remote add origin git@github.com:tuusuario/ventas-miss-yera.git\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Para practicar sin cuenta y sin internet vamos a hacer algo que además te\n",
    "enseña qué es GitHub por dentro: **un servidor de práctica en tu propia\n",
    "máquina**. Es una carpeta con la historia y sin archivos a la vista, que\n",
    "es exactamente lo que GitHub guarda de tu proyecto."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "cd ..\n",
    "git init -q --bare servidor-de-practica.git\n",
    "cd ventas-miss-yera\n",
    "git remote add origin ../servidor-de-practica.git\n",
    "git remote -v"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Sale dos veces, una para traer (`fetch`) y otra para llevar\n",
    "(`push`), porque en teoría podrían ser direcciones distintas. En la\n",
    "práctica nunca lo son 🤝"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y ahora sí, subirlo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "git push -u origin main"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ese `-u` se escribe una sola vez en la vida del proyecto. Lo que\n",
    "hace es dejar apuntado que tu rama `main` de aquí se corresponde con\n",
    "la `main` de allá, y desde entonces basta con escribir\n",
    "`git push` a secas.\n",
    "\n",
    "Fíjate en algo importante: **tu commit no cambió**. Subir no\n",
    "crea nada nuevo, copia lo que ya existía. El hash de allá y el de aquí son el\n",
    "mismo 🪞"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "git log --oneline\n",
    "git ls-remote origin"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que GitHub añade y Git no tiene"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Si GitHub solo fuera una copia, no sería gran cosa. Lo que añade encima es\n",
    "la parte social, y esa parte no existe en Git:\n",
    "\n",
    "- **Issues**, para pedir ayuda o reportar que algo no funciona.\n",
    "\n",
    "- **Pull requests**, para proponer un cambio en el proyecto de\n",
    "otra persona.\n",
    "\n",
    "- **Actions**, para que se ejecuten cosas solas cuando subes.\n",
    "\n",
    "- **Releases**, para marcar \"esta es la versión que la gente debe\n",
    "descargar\".\n",
    "\n",
    "- El perfil, las estrellas y todo lo que hace que un proyecto se encuentre.\n",
    "\n",
    "Cuando alguien te dice \"está en GitHub\", casi siempre quiere decir \"hay un\n",
    "repositorio de Git ahí, y encima de él hay una conversación\" 💬"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "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.\n",
    "\n",
    "```\n",
    "$ git push -u origin main\n",
    "\n",
    "Enumerating objects: 12, done.\n",
    "To github.com:tuusuario/ventas-miss-yera.git\n",
    " * [new branch]      main -> main\n",
    "```\n",
    "\n",
    "**¿Qué está mal?** La respuesta está en el cuaderno de soluciones. Míralo tú primero."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comprueba que se entendió"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "Se cae internet toda la mañana. ¿Qué puedes seguir haciendo con tu repositorio?\n",
    "\n",
    "a) Nada, Git necesita conexión\n",
    "\n",
    "b) Todo menos subir y bajar\n",
    "\n",
    "c) Solo mirar, no puedo guardar\n",
    "\n",
    "d) Solo si antes hice push"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Pregunta a quién conoce\n",
    "\n",
    "Crea el repositorio del catálogo de bodegas y lista sus\n",
    "remotos antes de configurar ninguno."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Móntale su servidor de práctica\n",
    "\n",
    "Crea el repositorio vacío que hará de GitHub y conéctalo\n",
    "con el apodo `origin`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Sube el catálogo\n",
    "\n",
    "Manda la rama `main` al servidor y deja la\n",
    "correspondencia apuntada."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Comprueba que allá está lo mismo\n",
    "\n",
    "Compara el hash de tu último commit con el que tiene el\n",
    "servidor."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Sube un cambio más\n",
    "\n",
    "Agrega un minimarket de Trujillo y súbelo, ya sin escribir\n",
    "el destino."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Cámbiale el apodo al remoto\n",
    "\n",
    "Renombra `origin` a `github` y\n",
    "comprueba que sigue funcionando igual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. Desconéctalo del todo\n",
    "\n",
    "Quita el remoto y comprueba que el repositorio sigue\n",
    "entero."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Git guarda tu historia; GitHub guarda una copia y le pone\n",
    "conversación encima. Lo que conecta los dos es una sola línea.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 12 de **Git desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/git-desde-cero/que-es-github/\n",
    "\n",
    "Que tengas lindo día! 🌸"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "name": "python",
   "version": "3.11"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
