{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Trabajar en dos cosas a la vez\n",
    "\n",
    "Las ramas, que son mucho más simples de lo que parecen\n",
    "\n",
    "Cuaderno de práctica del capítulo 10 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/ramas/\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": [
    "## 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({\n",
    "    1: \"U3dpdGNoZWQgdG8gYnJhbmNoICdyZXBvcnRlLXBvci1jYW5hbCcKY2FuYWxlcy5jc3YKdmVudGFzLmNzdg==\",\n",
    "    2: \"Y2l1ZGFkLG1vbnRvCkxpbWEsMTIwMA==\",\n",
    "    3: \"U3dpdGNoZWQgdG8gYnJhbmNoICdtYWluJwpTd2l0Y2hlZCB0byBhIG5ldyBicmFuY2ggJ2NhdGFsb2dvLWNsaWVudGVzJwoqIGNhdGFsb2dvLWNsaWVudGVzCiAgbWFpbgogIHJlcG9ydGUtcG9yLWNhbmFs\",\n",
    "    4: \"KiA0MTUyYjYyIFNlIGFncmVnYSBlbCBjYXRhbG9nbyBkZSBib2RlZ2FzCiogMTk3NjkzMyBVcmdlbnRlLCBlbnRyYW4gbGFzIHZlbnRhcyBkZSBBcmVxdWlwYQp8ICogYzUxNjY4MyBTZSBhZ3JlZ2EgZWwgY2F0YWxvZ28gZGUgY2FuYWxlcwp8LyAgCiogNTRkYTZlMiBQcmltZXJhcyB2ZW50YXMgZGUgTGltYQ==\",\n",
    "    5: \"Y2F0YWxvZ28tY2xpZW50ZXM=\",\n",
    "    6: \"U3dpdGNoZWQgdG8gYnJhbmNoICdtYWluJwoqIG1haW4=\",\n",
    "    7: \"ZXJyb3I6IHRoZSBicmFuY2ggJ2NhdGFsb2dvLWNsaWVudGVzJyBpcyBub3QgZnVsbHkgbWVyZ2VkLgpJZiB5b3UgYXJlIHN1cmUgeW91IHdhbnQgdG8gZGVsZXRlIGl0LCBydW4gJ2dpdCBicmFuY2ggLUQgY2F0YWxvZ28tY2xpZW50ZXMn\",\n",
    "}, lenguaje=\"bash\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Para qué sirven"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Estás con el reporte nuevo y llega un arreglo urgente. Con una sola rama\n",
    "tienes las dos cosas mezcladas en la misma carpeta y no puedes entregar una sin\n",
    "la otra.\n",
    "\n",
    "Con ramas trabajas en dos líneas de tiempo distintas y saltas entre ellas."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "mkdir tienda\n",
    "cd tienda\n",
    "git init -q\n",
    "printf 'ciudad,monto\\nLima,1200\\n' > ventas.csv\n",
    "git add ventas.csv\n",
    "git commit -q -m \"Primeras ventas de Lima\"\n",
    "git branch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Una sola rama, `main`, y el asterisco dice que estás en ella."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Crear y entrar, en un solo movimiento"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git switch -c reporte-por-canal\n",
    "git branch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El `-c` es de crear. Ojo con esto porque es donde más gente se\n",
    "tropieza: `git branch nombre` crea la rama pero **no te lleva a\n",
    "ella**, y terminas haciendo los commits en el sitio equivocado.\n",
    "\n",
    "Trabajo aquí:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "printf 'canal\\nbodega\\n' > canales.csv\n",
    "git add canales.csv\n",
    "git commit -q -m \"Se agrega el catalogo de canales\"\n",
    "git log --oneline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Y ahora el salto"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git switch main\n",
    "ls\n",
    "git log --oneline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Aquí está la magia: `canales.csv` **no está**. No se\n",
    "borró, está en la otra rama. Tu carpeta cambia de contenido según dónde estés\n",
    "parada, y por eso hay que mirar en qué rama estás antes de empezar a trabajar 🧭\n",
    "\n",
    "Hago el arreglo urgente aquí, tranquila:"
   ]
  },
  {
   "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 -q -m \"Urgente, entran las ventas de Arequipa\"\n",
    "git log --all --oneline --graph"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dos líneas de tiempo que salieron del mismo punto. Juntarlas es el capítulo\n",
    "11."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Borrar una rama"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git switch -c prueba\n",
    "git switch main\n",
    "git branch -d prueba\n",
    "git branch"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Se borró sin quejarse porque no tenía nada que perder. Pero si la rama tiene\n",
    "commits que no están en ningún otro sitio, Git se planta:"
   ]
  },
  {
   "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 branch -d reporte-por-canal"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "error: the branch 'reporte-por-canal' is not fully merged.\n",
    "If you are sure you want to delete it, run 'git branch -D reporte-por-canal'\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*Not fully merged*: ahí dentro hay trabajo que no está en `main`.\n",
    "Ese aviso ha salvado muchísimo trabajo, y por eso la `-D` mayúscula\n",
    "conviene tratarla con el mismo respeto que `reset --hard`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Te piden un cambio urgente en el reporte de ventas mientras estás a medias con otra cosa. Creas la rama para el arreglo urgente y te pones a trabajar.\n",
    "\n",
    "```\n",
    "$ git branch arreglo-urgente\n",
    "$ nano reporte.py         # haces el arreglo\n",
    "$ git add reporte.py\n",
    "$ git commit -m \"Arreglo urgente del reporte\"\n",
    "$ git branch\n",
    "\n",
    "  arreglo-urgente\n",
    "* 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",
    "Estás en una rama, haces `git switch main` y un archivo tuyo desaparece de la carpeta. ¿Qué pasó?\n",
    "\n",
    "a) Se borró y hay que recuperarlo\n",
    "\n",
    "b) Está en la otra rama, vuelve y aparece\n",
    "\n",
    "c) Git lo mandó al stash\n",
    "\n",
    "d) Hay que hacer un merge para recuperarlo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Vuelve a tu rama y comprueba\n",
    "\n",
    "Regresa a la rama del reporte y mira que el archivo está."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Y que aquí falta lo urgente\n",
    "\n",
    "Mira el CSV de ventas en esta rama."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Una rama por cada cosa\n",
    "\n",
    "Crea una tercera rama para el catálogo de clientes y haz un\n",
    "commit ahí."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Mira el árbol completo\n",
    "\n",
    "Dibuja todas las ramas a la vez."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. En qué rama estoy\n",
    "\n",
    "Pregunta solo el nombre de la rama actual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Qué ramas ya están juntas con main\n",
    "\n",
    "Lista las ramas cuyo trabajo ya está en la rama actual."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 6\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 7. Intenta borrar una rama con trabajo dentro\n",
    "\n",
    "Prueba a borrar la del catálogo de clientes."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%revisa 7\n",
    "# tu turno"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Una rama es un nombre que apunta a un commit. Cambiar de rama no\n",
    "copia nada, mueve un puntero.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Preguntas frecuentes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "¿Qué es una rama en Git?Una línea de trabajo paralela. Te llevas una copia de la historia, trabajas ahí sin tocar lo que funciona, y cuando está listo se junta.\n",
    "\n",
    "¿Cómo creo una rama?Con git switch -c y el nombre. La versión antigua es git checkout -b y hace lo mismo.\n",
    "\n",
    "¿Qué hace git merge?Junta el trabajo de una rama con otra. Si las dos tocaron la misma línea, aparece un conflicto y hay que decidir a mano cuál se queda.\n",
    "\n",
    "¿Cuál es la diferencia entre git pull y git fetch?fetch trae lo que hay en el remoto y no toca tus archivos. pull hace lo mismo y además lo junta con lo tuyo. Cuando algo sale raro, fetch primero y mirar."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 10 de **Git desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/git-desde-cero/ramas/\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
}
