{
 "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 práctica 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",
    "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: \"TWlzcyBZZXJhCmhvbGFAbWlzc3llcmEuY29t\",\n",
    "    2: \"WWVyYSBlbiBsYSBib2RlZ2E=\",\n",
    "    3: \"TWlzcyBZZXJh\",\n",
    "    4: \"Y29tbWl0IC1t\",\n",
    "    5: \"W2luaXRdCglkZWZhdWx0QnJhbmNoID0gbWFpbgpbY29sb3JdCgl1aSA9IGZhbHNlClthZHZpY2VdCglkZXRhY2hlZEhlYWQgPSBmYWxzZQpbdXNlcl0KCW5hbWUgPSBNaXNzIFllcmEKCWVtYWlsID0gaG9sYUBtaXNzeWVyYS5jb20KW2FsaWFzXQoJaGlzdG9yaWEgPSBsb2cgLS1vbmVsaW5lIC0tZ3JhcGgKCWd1YXJkYSA9IGNvbW1pdCAtbQ==\",\n",
    "    6: \"\",\n",
    "}, 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?** 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",
    "¿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"
   ]
  },
  {
   "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": [
    "%%revisa 1\n",
    "# tu turno"
   ]
  },
  {
   "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": [
    "%%revisa 2\n",
    "# tu turno"
   ]
  },
  {
   "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": [
    "%%revisa 3\n",
    "# tu turno"
   ]
  },
  {
   "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": [
    "%%revisa 4\n",
    "# tu turno"
   ]
  },
  {
   "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": [
    "%%revisa 5\n",
    "# tu turno"
   ]
  },
  {
   "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": [
    "# tu turno"
   ]
  },
  {
   "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
}
