{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Dejar tu máquina lista\n",
    "\n",
    "Instalar Git, decirle quién eres y no tener que volver a tocarlo\n",
    "\n",
    "Cuaderno de soluciones del capítulo 2 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/instalar-y-configurar/\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": [
    "## Primero, mira si ya lo tienes"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Antes de crear el repositorio de ventas del capítulo\n",
    "3, hay que dejar la máquina lista. Son cinco\n",
    "minutos y no se vuelve a tocar.\n",
    "\n",
    "Mucha gente tiene Git instalado sin saberlo, porque vino con otro programa.\n",
    "Abre la terminal y pregunta:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git --version"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Si te contesta con un número, ya está, sáltate a la sección siguiente. Si te\n",
    "dice *command not found* o *no se reconoce el comando*, hay que\n",
    "instalarlo."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Instalarlo"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Esto cambia según tu computadora y no lo puedo ejecutar por ti, así que va\n",
    "como lista y no como bloque.\n",
    "\n",
    "**Windows.** Baja el instalador de\n",
    "[git-scm.com](https://git-scm.com/download/win) y dale siguiente a\n",
    "todo. Te va a instalar de paso una terminal que se llama Git Bash, y es la que\n",
    "vas a usar en este libro: los comandos son los mismos que en Mac y en Linux.\n",
    "\n",
    "**Mac.** Abre la Terminal y escribe `git --version`.\n",
    "Si no lo tienes, el propio sistema te ofrece instalarlo con un botón. Eso es\n",
    "todo.\n",
    "\n",
    "**Linux.** `sudo apt install git` en Ubuntu y\n",
    "derivados, `sudo dnf install git` en Fedora.\n",
    "\n",
    "No instales nada más. Los programas con ventanitas para Git existen y algunos\n",
    "son buenos, pero si empiezas por ahí vas a aprender a apretar botones sin\n",
    "entender qué pasa debajo, y el día que el botón no esté te quedas parada."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Decirle quién eres"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Esta es la parte que la gente se salta y la que después duele. Git firma cada\n",
    "commit con un nombre y un correo, y los saca de su configuración:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git config --global user.name \"Miss Yera\"\n",
    "git config --global user.email \"hola@missyera.com\"\n",
    "git config --global init.defaultBranch main\n",
    "git config --global --list"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Tres comandos y ya no se toca más. Te explico los tres, porque cada uno tiene\n",
    "su porqué:\n",
    "\n",
    "`user.name` y `user.email` son tu firma. Usa el mismo\n",
    "correo con el que vas a abrir tu cuenta de GitHub, porque GitHub reconoce a la\n",
    "gente por ahí: si el correo no coincide, tus commits aparecen sin foto y no\n",
    "cuentan en tu perfil.\n",
    "\n",
    "`init.defaultBranch main` es cómo se va a llamar la primera rama\n",
    "de tus repositorios. Durante años se llamó *master* y hoy el estándar es\n",
    "*main*. Si no lo pones, Git te lo recuerda con un aviso larguísimo cada\n",
    "vez que creas un repositorio."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Dónde vive todo eso"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "El `--global` significa \"para toda esta computadora\", y se guarda\n",
    "en un archivo de texto en tu carpeta personal:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "echo \"$HOME/.gitconfig\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Es un archivo normal, lo puedes abrir y leer. Saber esto sirve para dos\n",
    "cosas: cuando algo raro pasa, ahí está la respuesta; y cuando cambies de\n",
    "computadora, ese archivo es todo lo que tienes que copiar.\n",
    "\n",
    "Y hay un segundo nivel: si dentro de un proyecto corres el mismo comando\n",
    "**sin** el `--global`, la configuración vale solo para\n",
    "ese proyecto y le gana a la general. Eso es lo que salva la situación de la\n",
    "trampa de más abajo."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Un atajo que vas a usar todos los días"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Git te deja inventar tus propios comandos. Se llaman alias y se configuran\n",
    "igual:"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git config --global alias.historia \"log --oneline --graph\"\n",
    "git config --global --get alias.historia"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "A partir de ahora `git historia` hace lo mismo que ese comando\n",
    "largo. Empieza con este y ve agregando los que se te repitan.\n",
    "\n",
    "Yo tengo cuatro, y los cuatro salieron de lo mismo: comandos que escribía\n",
    "todos los días mientras armaba el repositorio de ventas de Lima y Arequipa. Si\n",
    "un comando se te repite tres veces en una semana, ya se ganó su alias 🔖"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## El error que vas a ver mil veces"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "No es de Git, es de la terminal, y es el más común de todos cuando recién\n",
    "empiezas:"
   ]
  },
  {
   "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",
    "cd carpeta-que-no-existe"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Y la queja que tiene que salir es esta:\n",
    "\n",
    "```\n",
    "bash: line 1: cd: carpeta-que-no-existe: No such file or directory\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "*No such file or directory*: no existe esa carpeta. Casi siempre es\n",
    "una de tres cosas: escribiste mal el nombre, estás parada en otro sitio, o la\n",
    "carpeta tiene un espacio y hay que ponerla entre comillas.\n",
    "\n",
    "Para saber dónde estás parada, `pwd`. Para ver qué hay ahí,\n",
    "`ls`. Esos dos comandos y `cd` son el 90% de moverse por\n",
    "la terminal, y no hay más misterio 🧭"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### La trampa\n",
    "\n",
    "Te presta la laptop una amiga para avanzar un rato, clonas tu proyecto y haces tres commits. Todo funciona, nada falla.\n",
    "\n",
    "```\n",
    "$ git log --format=\"%an <%ae>\"\n",
    "\n",
    "Carla Rojas <carla@otraempresa.com>\n",
    "Carla Rojas <carla@otraempresa.com>\n",
    "Carla Rojas <carla@otraempresa.com>\n",
    "```\n",
    "\n",
    "**Qué está mal**\n",
    "\n",
    "Los tres commits quedaron firmados por ella 🙈\n",
    "\n",
    "Git no pregunta quién eres en cada commit: lo lee de la configuración de la máquina, y esa máquina no es tuya. En GitHub esos commits ni siquiera van a aparecer en tu perfil, porque GitHub reconoce a la gente por el correo del commit.\n",
    "\n",
    "Se arregla en diez segundos **antes** de empezar, con un `git config user.name` y un `git config user.email` sin el `--global`, para que valgan solo en ese proyecto y no le cambies la configuración a la dueña de la laptop.\n",
    "\n",
    "Y la costumbre que lo caza: en una máquina prestada, el primer comando siempre es `git config --list`."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Comprueba que se entendió"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Comprueba que lo tienes\n",
    "\n",
    "¿Para qué sirve `git config --global user.email`?\n",
    "\n",
    "a) Para iniciar sesión en GitHub\n",
    "\n",
    "b) Para que Git firme tus commits con ese correo\n",
    "\n",
    "c) Para recibir avisos cuando alguien cambie el proyecto\n",
    "\n",
    "d) Para proteger el repositorio con contraseña\n",
    "\n",
    "---\n",
    "\n",
    "**La correcta es la b.**\n",
    "\n",
    "*a)* No. Git no inicia sesión en ningún lado: funciona sin internet. Ese correo es solo la firma que va dentro de cada commit.\n",
    "\n",
    "*c)* Eso son las notificaciones de GitHub y se configuran en su página. Este comando no manda ningún correo.\n",
    "\n",
    "*d)* Git no tiene contraseñas. Quien tenga acceso a la carpeta tiene acceso a todo.\n",
    "\n",
    "La configuración es tu firma, no tu llave 🖊️"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Ejercicios"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1. Comprueba que quedó bien\n",
    "\n",
    "Pide solo tu nombre y solo tu correo, uno por uno."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git config --global --get user.name\n",
    "git config --global --get user.email"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "Miss Yera\n",
    "hola@missyera.com\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Si alguno sale vacío, vuelve a correr el comando de arriba. Mejor descubrirlo\n",
    "ahora que dentro de treinta commits."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2. Un nombre distinto solo para un proyecto\n",
    "\n",
    "Crea un repositorio de prueba y ponle una firma propia, sin\n",
    "`--global`. Después comprueba cuál gana."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "mkdir prueba-config\n",
    "cd prueba-config\n",
    "git init -q\n",
    "git config user.name \"Yera en la bodega\"\n",
    "git config --get user.name"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "Yera en la bodega\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Dentro de esta carpeta manda esta configuración; fuera sigue mandando la\n",
    "general. Es exactamente lo que necesitas en una laptop prestada 💻"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 3. Y comprueba que afuera no cambió nada\n",
    "\n",
    "Sal de la carpeta y vuelve a preguntar."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "cd ..\n",
    "git config --global --get user.name"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "Miss Yera\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Intacta. Los dos niveles conviven sin pisarse, y ese es todo el truco."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 4. Inventa tu segundo alias\n",
    "\n",
    "Crea un alias llamado `guarda` que haga\n",
    "`commit -m`, y comprueba que quedó."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git config --global alias.guarda \"commit -m\"\n",
    "git config --global --get alias.guarda"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "commit -m\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Desde ahora `git guarda \"Ventas de Chiclayo\"` hace el commit. Los\n",
    "alias son de las pocas cosas de Git que puedes armar a tu gusto."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5. Lee tu configuración como lo que es, un archivo\n",
    "\n",
    "Muestra el contenido del archivo de configuración con\n",
    "`cat`, sin usar ningún comando de Git."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "cat \"$HOME/.gitconfig\""
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "[init]\n",
    "\tdefaultBranch = main\n",
    "[color]\n",
    "\tui = false\n",
    "[advice]\n",
    "\tdetachedHead = false\n",
    "[user]\n",
    "\tname = Miss Yera\n",
    "\temail = hola@missyera.com\n",
    "[alias]\n",
    "\thistoria = log --oneline --graph\n",
    "\tguarda = commit -m\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ahí está todo lo que configuraste, en texto plano. Puedes editarlo a mano si\n",
    "quieres, aunque los comandos son menos peligrosos."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 6. Pregunta por algo que no configuraste\n",
    "\n",
    "Pide una configuración que no existe, por ejemplo el editor\n",
    "por defecto. Tiene que fallar en silencio."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "%%consola\n",
    "git config --global --get core.editor"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "```\n",
    "\n",
    "```"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Ni una palabra, y sin embargo falló: no imprime nada y devuelve un código de\n",
    "error. Es la forma que tiene Git de decir \"eso no está puesto\" 🤷\n",
    "\n",
    "Si quieres ponerlo, `git config --global core.editor \"nano\"` es la\n",
    "opción más suave para empezar. El editor por defecto en muchos sistemas es vim,\n",
    "y del que no se sabe salir sin buscarlo en internet."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Lo que te llevas"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "**Se configura una vez en la vida, pero si no se configura, cada commit\n",
    "lleva la firma equivocada para siempre.**"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "---\n",
    "\n",
    "Ese era el capítulo 2 de **Git desde cero**. El texto completo, con las salidas de cada bloque, está en https://missyera.com/guias/git-desde-cero/instalar-y-configurar/\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
}
