{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Por qué existe Git\n",
    "\n",
    "La carpeta donde todo se llama final, y lo que Git hace con ella\n",
    "\n",
    "Cuaderno de soluciones del capítulo 1 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/por-que-existe-git/\n",
    "\n",
    "Este es el cuaderno de **soluciones**. Trae el código de cada ejercicio, la\n",
    "explicación de la trampa y la respuesta del quiz. Si vienes del cuaderno de\n",
    "práctica sin haberlo intentado, vuelve 🙂"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Antes de empezar\n",
    "\n",
    "Este capítulo son comandos de terminal, no Python. La celda de abajo baja el\n",
    "ayudante que los ejecuta y que **recuerda en qué carpeta quedaste**, que es lo\n",
    "que hace falta para que un `cd` de una celda siga valiendo en la siguiente.\n",
    "\n",
    "A partir de ahí, cada celda de comandos empieza por `%%consola`."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "import urllib.request\n",
    "\n",
    "# El ayudante de los cuadernos. Trae la corrección de los ejercicios y, en los\n",
    "# capítulos de consola, la celda mágica que ejecuta los comandos. Se baja en\n",
    "# vez de venir pegado aquí para que siempre sea el último.\n",
    "urllib.request.urlretrieve(\n",
    "    \"https://missyera.com/static/cuadernos/revisa.py\", \"revisa.py\")\n",
    "import revisa\n",
    "revisa.carga({}, lenguaje=\"bash\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## La carpeta que todas tenemos"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Abre la carpeta donde guardas los informes del trabajo. Yo espero.\n",
    "\n",
    "Si se parece a la mía, ahí dentro hay algo así:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "mkdir -p informes\n",
    "cd informes\n",
    "touch \"informe.docx\" \"informe_v2.docx\" \"informe_final.docx\" \\\n",
    "      \"informe_final_v2.docx\" \"informe_final_ESTE_SI.docx\" \\\n",
    "      \"informe_final_ESTE_SI_corregido.docx\"\n",
    "ls"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Seis archivos que son el mismo archivo."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "ls -1 | wc -l"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y ahora contesta rápido, sin abrirlos: **¿cuál es el bueno?**\n",
    "\n",
    "Ese medio segundo de duda es el problema entero. No es que seas\n",
    "desordenada. Es que una carpeta no sabe contar historias: solo sabe tener\n",
    "archivos, y el nombre del archivo es el único sitio donde puedes escribir\n",
    "cuándo lo hiciste y por qué 📋\n",
    "\n",
    "Y encima el nombre miente. `informe_final_ESTE_SI` era el bueno el\n",
    "martes. El jueves ya no."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Qué hace Git con eso"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Git le pone a la carpeta una memoria. En vez de seis archivos, tienes uno\n",
    "solo, y aparte una lista de todos los momentos por los que pasó ese archivo,\n",
    "cada uno con su fecha y con una frase tuya explicando qué cambió.\n",
    "\n",
    "Se ve mejor haciéndolo. Voy a armar la carpeta de las ventas de la tienda,\n",
    "que es la que vamos a usar en todo el libro."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "cd ..\n",
    "mkdir ventas-miss-yera\n",
    "cd ventas-miss-yera\n",
    "git init"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ya está. Esa carpeta ahora tiene memoria.\n",
    "\n",
    "Le meto el primer archivo, las ventas de Lima:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "printf 'ciudad,monto\\nLima,1200\\n' > ventas.csv\n",
    "cat ventas.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El primer momento, y el primer tropiezo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Guardar un momento se llama **hacer un commit**. Se dice así en\n",
    "todos lados y en español no tiene traducción buena, así que nos quedamos con\n",
    "commit. Lo pido:"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Esto revienta a propósito**, y de eso va. La celda te muestra la queja igual que te la mostraría tu terminal."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git commit -m \"Ventas de Lima\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "On branch main\n",
    "\n",
    "Initial commit\n",
    "\n",
    "Untracked files:\n",
    "  (use \"git add <file>...\" to include in what will be committed)\n",
    "\tventas.csv\n",
    "\n",
    "nothing added to commit but untracked files present (use \"git add\" to track)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "No lo hizo. Y fíjate en la última línea, porque es de las pocas veces que un\n",
    "programa te dice exactamente qué te falta: *nothing added to commit*,\n",
    "nada agregado para guardar.\n",
    "\n",
    "Git no guarda lo que encuentra. Guarda lo que tú le señalas. Es a propósito:\n",
    "en la carpeta hay archivos que no quieres guardar nunca, y ya volveremos sobre\n",
    "eso. Así que primero señalo el archivo y después guardo el momento:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git add ventas.csv\n",
    "git commit -m \"Primeras ventas de Lima\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Eso de `54da6e2` es el nombre del momento. Se llama hash y sale de\n",
    "mezclar lo que guardaste con quién eres tú y qué hora era, así que\n",
    "**a ti te va a salir otro**. No te asustes cuando pase: es lo\n",
    "normal, y en el capítulo 3 te cuento por qué."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y ahora la parte que enamora"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Llegan las ventas de Arequipa. Cambio el archivo y guardo otro momento:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "printf 'Arequipa,890\\n' >> ventas.csv\n",
    "git add ventas.csv\n",
    "git commit -m \"Se suman las ventas de Arequipa\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Un solo `ventas.csv` en la carpeta. Cero archivos con ESTE_SI. Y\n",
    "sin embargo:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git log --oneline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahí está la historia. Dos momentos, el último arriba, cada uno con la frase\n",
    "que yo escribí. Eso es lo que la carpeta no sabía hacer.\n",
    "\n",
    "Y puedo preguntarle qué cambió exactamente entre uno y otro:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git diff HEAD~1 HEAD -- ventas.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "La línea con el `+` delante es lo que entró. Nadie tuvo que\n",
    "acordarse, ni comparar dos Excel abiertos al lado, ni preguntar por WhatsApp\n",
    "cuál era el bueno 🙌"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que Git no es"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Tres confusiones que veo siempre, y mejor sacarlas del medio ahora.\n",
    "\n",
    "**Git no es GitHub.** Git es el programa que corre en tu\n",
    "computadora y no necesita internet. GitHub es una página donde puedes dejar una\n",
    "copia de tu repositorio para compartirlo. Puedes usar Git toda tu vida sin\n",
    "GitHub. Le dedicamos un capítulo entero más adelante porque es donde más gente\n",
    "se pierde.\n",
    "\n",
    "**Git no es solo para código.** Funciona con cualquier archivo\n",
    "de texto: tus consultas SQL, tus notas, un CSV de ventas, la propuesta de un\n",
    "cliente. Con un Word o un PDF funciona a medias, porque Git sabe decirte qué\n",
    "línea cambió en un texto y no sabe hacerlo dentro de un binario.\n",
    "\n",
    "**Git no es una copia de seguridad.** Guarda la historia en la\n",
    "misma computadora. Si se te malogra el disco, se va todo. Para eso está la\n",
    "copia en GitHub, que es otra cosa."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Por qué esto te toca ahora"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Durante veinte años Git fue cosa de programadores. Dejó de serlo el día que\n",
    "las herramientas de IA se mudaron a GitHub.\n",
    "\n",
    "Hoy quieres probar una skill de Claude, un agente que alguien publicó o el\n",
    "proyecto que viste en LinkedIn, y todos están en un repositorio. Sin Git te\n",
    "quedas mirando desde afuera, con el botón verde que dice Code y sin saber qué\n",
    "hacer con él.\n",
    "\n",
    "Ese es el libro. No vas a terminar siendo programadora: vas a terminar\n",
    "pudiendo bajar lo que encuentres, entenderlo, cambiarlo y publicar lo tuyo."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Creas el repositorio de la tienda, todo va bien, y a la semana notas que cualquier cosa que guardas en el escritorio aparece como cambio pendiente.\n",
    "\n",
    "```\n",
    "$ cd ~\n",
    "$ git init\n",
    "$ git status\n",
    "\n",
    "On branch main\n",
    "Untracked files:\n",
    "\t Descargas/\n",
    "\t Documentos/\n",
    "\t Escritorio/\n",
    "\t ... (14.203 archivos más)\n",
    "```\n",
    "\n",
    "**Qué está mal**\n",
    "\n",
    "El `git init` se corrió en tu carpeta personal, no en la del proyecto 📁\n",
    "\n",
    "Git no se queja: convierte en repositorio la carpeta donde estás parada, sea cual sea, y a partir de ahí vigila todo lo que hay debajo. Tus fotos, tus descargas y el Excel de la contadora.\n",
    "\n",
    "Por eso el orden del capítulo 3 es crear la carpeta, **entrar** y recién ahí inicializar. Los tres pasos en ese orden, siempre.\n",
    "\n",
    "Si ya te pasó, no hay que reinstalar nada: se borra la carpeta oculta `.git` que quedó en tu casa y listo, todo vuelve a ser una carpeta normal."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comprueba que se entendió"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "¿Qué guarda Git cuando haces un commit?\n",
    "\n",
    "a) Los archivos que cambiaron desde el commit anterior\n",
    "\n",
    "b) Un momento de la carpeta entera, con la frase que tú escribiste\n",
    "\n",
    "c) Una copia de seguridad de tu computadora\n",
    "\n",
    "d) El archivo con un número de versión al final del nombre\n",
    "\n",
    "---\n",
    "\n",
    "**La correcta es la b.**\n",
    "\n",
    "*a)* Casi. Guarda el momento completo de la carpeta, no solo lo que cambió. Vuelve a leer la parte de los momentos.\n",
    "\n",
    "*c)* Esa es la confusión número tres del capítulo. Git guarda la historia en el mismo disco: si el disco muere, muere todo.\n",
    "\n",
    "*d)* Eso es justo lo que Git viene a reemplazar. Los nombres con _v2 y _final son el problema, no la solución.\n",
    "\n",
    "Un commit es una foto de la carpeta con una nota tuya pegada 📸"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Los ejercicios son la mitad del libro. Intenta antes de abrir."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Cuenta tus propios ESTE_SI\n",
    "\n",
    "Antes de seguir, abre la carpeta donde guardas tu trabajo y\n",
    "cuenta cuántos archivos son en realidad el mismo archivo en versiones\n",
    "distintas. No hace falta comando, hace falta honestidad."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Yo conté seis del mismo informe y dos de la misma propuesta para un cliente.\n",
    "Ocho archivos que eran dos. Ese número es tu motivo para terminar el libro 📊"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Pregúntale a Git dónde estás parada\n",
    "\n",
    "Dentro de la carpeta de ventas, pide el estado. Es el\n",
    "comando que más vas a escribir en tu vida."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git status"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "On branch main\n",
    "nothing to commit, working tree clean\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Working tree clean* significa que no hay nada pendiente: todo lo que\n",
    "está en la carpeta ya está guardado en la historia. Cuando algo te dé miedo,\n",
    "este comando es el primero."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Un tercer momento, con Trujillo\n",
    "\n",
    "Agrega las ventas de Trujillo por 1.450 soles y guarda el\n",
    "momento con una frase que explique qué hiciste."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "printf 'Trujillo,1450\\n' >> ventas.csv\n",
    "git add ventas.csv\n",
    "git commit -m \"Se suman las ventas de Trujillo\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "[main 7fae607] Se suman las ventas de Trujillo\n",
    " 1 file changed, 1 insertion(+)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Fíjate que el mensaje dice qué pasó, no dice \"cambios\". Dentro de seis meses\n",
    "vas a agradecerte cada frase que escribiste bien."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Mira la historia completa\n",
    "\n",
    "Pide el log corto y comprueba que están los tres momentos,\n",
    "el más reciente arriba."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git log --oneline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "7fae607 Se suman las ventas de Trujillo\n",
    "77fadab Se suman las ventas de Arequipa\n",
    "54da6e2 Primeras ventas de Lima\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Tres líneas, tres decisiones tuyas. Y el archivo sigue siendo uno solo."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Cuántas líneas tiene el archivo de verdad\n",
    "\n",
    "Comprueba que en la carpeta hay un solo CSV y que dentro\n",
    "están las cuatro líneas: la cabecera y las tres ciudades."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "ls\n",
    "cat ventas.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "ventas.csv\n",
    "ciudad,monto\n",
    "Lima,1200\n",
    "Arequipa,890\n",
    "Trujillo,1450\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Esto es lo que quería que vieras: **una carpeta limpia con una historia\n",
    "larga detrás**. Antes tenías la historia desparramada en los nombres de\n",
    "los archivos; ahora está guardada donde se puede consultar."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Vuelve a ver Lima sola, sin romper nada\n",
    "\n",
    "Pídele a Git cómo se veía `ventas.csv` en el\n",
    "primer momento, cuando solo estaba Lima. Ojo: mirar no es volver."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git show HEAD~2:ventas.csv"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "ciudad,monto\n",
    "Lima,1200\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahí está el archivo como era al principio, y en tu carpeta sigue estando la\n",
    "versión con las tres ciudades. Puedes mirar el pasado sin mudarte a él 🕰️\n",
    "\n",
    "El `HEAD~2` significa \"dos momentos antes del actual\". Es la\n",
    "primera forma de moverte por la historia y no va a ser la última."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. El commit que no se hizo\n",
    "\n",
    "Crea un archivo con los datos del cliente de una bodega y\n",
    "trata de guardarlo sin señalarlo primero. Tiene que fallar."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "printf 'bodega,contacto\\nMinimarket Lima,999888777\\n' > clientes.csv\n",
    "git commit -m \"Datos del cliente\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "On branch main\n",
    "Untracked files:\n",
    "  (use \"git add <file>...\" to include in what will be committed)\n",
    "\tclientes.csv\n",
    "\n",
    "nothing added to commit but untracked files present (use \"git add\" to track)\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El mismo mensaje del principio del capítulo, y ahora ya sabes leerlo. Git no\n",
    "guarda lo que encuentra, guarda lo que le señalas 👆\n",
    "\n",
    "Que este error te salga tantas veces al principio es normal, y es bueno: es\n",
    "la barrera que impide que subas sin querer el archivo con las claves."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Una carpeta no sabe contar historias. Git le presta la memoria.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preguntas frecuentes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "¿Qué es Git?Un programa que guarda la historia de tus archivos: qué cambió, cuándo y quién. Es lo que te deja volver a como estaba el martes sin tener carpetas llamadas version_final_2.\n",
    "\n",
    "¿Qué es el control de versiones?Llevar registro de cada cambio en vez de sobrescribir. Git es el que se usa hoy en casi todas partes.\n",
    "\n",
    "¿Para qué sirve Git si trabajo sola?Para poder deshacer sin miedo y para saber qué hiciste hace tres semanas. Trabajar en equipo es la segunda razón, no la primera.\n",
    "\n",
    "¿Cuál es la diferencia entre Git y GitHub?Git es el programa y vive en tu computadora. GitHub es un sitio web donde se guardan copias de repositorios de Git. Puedes usar Git sin GitHub perfectamente."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 1 de **Git desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/git-desde-cero/por-que-existe-git/\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
}
