{ "metadata": { "language": "Julia", "name": "", "signature": "sha256:5ffa78297eed459074724a5d7059fa301a55f0fa5910d25fbddc0c0471831da4" }, "nbformat": 3, "nbformat_minor": 0, "worksheets": [ { "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 0. Instalaci\u00f3n de `git`, `julia` y el `ipython notebook`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `Git`\n", "\n", "Como se ver\u00e1 aqu\u00ed, `git` es una herramienta *extremadamente* \u00fatil, y esta aseveraci\u00f3n no s\u00f3lo incluye este curso, sino va *mucho* m\u00e1s all\u00e1. Esto est\u00e1 suficientemente bien cubierto en otros lugares. Entonces, sigan las instrucciones que est\u00e1n en el sitio oficial de [git](http://git-scm.com/book/en/v2/Getting-Started-Installing-Git), seg\u00fan la plataforma donde lo quieran usar.\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `ipython` y `ipython notebook`. (Modificado ligeramente del [curso de David P. Sanders](http://nbviewer.ipython.org/github/computo-fc/fisica_computacional/blob/master/notas/Parte%20I%20--%20Introduccion%20a%20la%20Programacion%20con%20Julia/0.%20Instalaci\u00f3n_de_IPython_y_IJulia.ipynb) )\n", "\n", "Realmente la manera m\u00e1s sencilla de tener todos los paquetes necesarios para usar el IPython Notebook de forma compatible es descargar [Anaconda](http://continuum.io/downloads), que es una \"distribuci\u00f3n\" que contiene Python y una gran variedad de paquetes de Python para c\u00f3mputo cient\u00edfico. Ah\u00ed basta que seleccionen su sistema operativo y su versi\u00f3n de 32/64 bits.\n", "\n", "Nota para Ubunteros: Para saber la versi\u00f3n que tienen de Ubuntu (probablemente sea 32 bits, pero m\u00e1s vale checar) den click en *Acerca de este equipo* que aparece como primer opci\u00f3n cuando abren el men\u00fa principal, i.e., el men\u00fa donde apagan, bloquean, etc. el equipo.\n", "\n", "**Ubuntu** En caso de que ya hubieran descargado todos estos paquetes hace tiempo y no tengan una versi\u00f3n actualizada, pueden adquirir la versi\u00f3n m\u00e1s reciente usando\n", "- conda update conda\n", "- conda update anaconda\n", "- conda update ipython\n", "\n", "**Mac** Los usuarios de Mac deben agregar estas l\u00edneas a su archivo `.bash_profile` (o crearlo con ellas si es que no lo tienen):\n", "```\n", "export LANG=en_US.UTF-8\n", "export LC_ALL=en_US.UTF-8\n", "```\n", "Despu\u00e9s de esto ya deben tener todos los paquetes funcionando; pueden probar tecleando\n", "```\n", "ipython notebook\n", "```\n", "desde una terminal (todos necesitamos terminales).\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### `julia`\n", "\n", "**Nota importante:** si ten\u00edan una versi\u00f3n previa de Julia, borren el directorio .julia de tu directorio hogar, para que las actualizaciones se hagan correctamente.\n", "\n", "Todos los paquetes necesarios los pueden encontrar en la secci\u00f3n de [downloads](http://julialang.org/downloads/) de http://julialang.org/, la p\u00e1gina hogar del lenguaje Julia. Ah\u00ed encuentran los paquetes de la versi\u00f3n \u201cestable\u201d o sea, la versi\u00f3n 0.3 y la de desarrollo (0.4.0-dev+XXXX). En el curso usaremos la versi\u00f3n 0.3.x (hasta que la 0.4 sea estable); conviene usar la \u00faltima. Adem\u00e1s, [aqu\u00ed](https://github.com/JuliaLang/julia) hay instrucciones expl\u00edcitas para instalar `julia` a partir de las fuentes.\n", "\n", "### Instalaci\u00f3n de IJulia\n", "\n", "Para agregar la interfaz del IJulia Notebook, entra al int\u00e9rprete con Julia (poniendo `julia` en una terminal, como arriba), y ejecuta el comando (\u00a1cuidado con las may\u00fasculas y las comillas dobles!):\n", "```\n", " julia> Pkg.add(\"IJulia\")\n", "```\n", "\n", "Para verificar que todo funciona, ejecuten desde una terminal\n", "```\n", "ipython notebook --profile julia\n", "```\n", "Eso deber\u00eda abrir una interfaz igual al IPython Notebook, pero con el logo de Julia en la parte superior izquierda. Para evitar teclear repetitivamente instrucciones largas, puedes definir\n", "un alias apropiad, por ejemplo:\n", "```\n", "alias IJulia='ipython notebook --profile julia'\n", "```\n", "que si lo pones en el archivo `~.bashrc` te simplificar\u00e1 la vida enormemente." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "1. \u00bfQu\u00e9 son `git` y `GitHub`?" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[git](http://git-scm.com) es un programa que sirve para rastrear los cambios en las versiones de un programa o proyecto (\"[version control system](http://en.wikipedia.org/wiki/Revision_control)\", o VCS). Se puede usar desde la l\u00ednea de comandos; permite checar cambios en cualquier punto de la historia, resetear a alg\u00fan punto espec\u00edfico del historial, tener desarrollos independientes, etc. Es c\u00f3digo abierto. Fue inventado por Linus Torvalds en el 2005 para el manejo y desarrollo del kernel de Linux. En pocas palabras, es un manejador de repositorios." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[GitHub](https://github.com) es un sitio-web/red social donde uno puede hacer un desarrollo colaborativo de alg\u00fan proyecto, de forma abierta o cerrada, y permite hacer respaldos en la nube. Actualmente, es donde se realizan la mayor parte de los proyectos abiertos." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Los comandos debajo est\u00e1n dise\u00f1ados para usarse en sistemas tipo Unix, es decir en Linux y Mac. Para usarlos en Windows, es necesario instalar [Git Bash](https://msysgit.github.io/) y llevar a cabo los comandos directamente desde Git Bash (no desde el Notebook). Tambi\u00e9n en Linux y Mac los comandos se pueden teclear directamente desde la terminal. Para hacerlo, simplemente no se escriben los `;` al principio de los comandos." ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "2. Creaci\u00f3n de un repositorio `git` y primeros pasos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "`git` es un manejador de *repositorios* con mucha flexibilidad. Un repositorio es un directorio donde se almacena el desarrollo de un proyecto. \n", "\n", "`git`, *en lugar* de hacer copias de cada archivo y cada uno de los cambios del proyecto, lo que hace es guardar los cambios en ciertos puntos de la historia, que el usuario define." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Antes de iniciar, el repositorio, veamos la estructura actual del directorio (que vale la pena, por ahora, que sea \"git-test\"). Para esto, desde la terminal, ejecutamos:\n", "```\n", "ls -alp\n", "```\n", "\n", "Esto, se puede hacer desde `julia` o `IJulia` usando `;`, que manda un comando a la terminal / l\u00ednea de comandos:\n", "```\n", "; ls -alp\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [ "; ls -alp" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "total 8\n", "drwxr-xr-x 4 benet staff 136 Feb 2 17:28 ./\n", "drwxr-xr-x 15 benet staff 510 Jan 21 10:51 ../\n", "drwxr-xr-x 3 benet staff 102 Feb 2 16:52 .ipynb_checkpoints/\n", "-rw------- 1 benet staff 2726 Feb 2 17:28 01-git.ipynb\n" ] } ], "prompt_number": 2 }, { "cell_type": "markdown", "metadata": {}, "source": [ "El directorio \".ipynb_checkpoints/\" incluye informaci\u00f3n de los distintos puntos donde he salvado este \"ipython notebook\", que de hecho es un \"ijulia notebook\". El otro archivo, es la versi\u00f3n actual de este notebook." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para empezar un repositorio git, hay que ejecutar la instrucci\u00f3n\n", "```\n", "; git init\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejercicio 1:** Crea un directorio nuevo que se llama `git-test` [recuerda que el comando de Linux para crear un directorio es `mkdir`, y para cambiar al directorio es `cd`] e inicializa tu repositorio git ah\u00ed; *hazlo* sin miedo. **NOTA:** La celda vac\u00eda que hay abajo es para que hagas el ejercicio. Aseg\u00farate de que el archivo `01-git.ipynb` se encuentre en este directorio (moverlo ah\u00ed si es necesario y vuelve a abrir el Notebook desde ah\u00ed)." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una vez que lo hayan hecho, el contenido de su directorio deber\u00eda verse como sigue:" ] }, { "cell_type": "code", "collapsed": false, "input": [ ";ls -alp" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "total 8\n", "drwxr-xr-x 5 benet staff 170 Feb 2 17:31 ./\n", "drwxr-xr-x 15 benet staff 510 Jan 21 10:51 ../\n", "drwxr-xr-x 9 benet staff 306 Feb 2 17:31 .git/\n", "drwxr-xr-x 3 benet staff 102 Feb 2 16:52 .ipynb_checkpoints/\n", "-rw------- 1 benet staff 3749 Feb 2 17:30 01-git.ipynb\n" ] } ], "prompt_number": 4 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Entonces, el comando `git init` crea el directorio escondido `.git/` que contendr\u00e1 toda la informaci\u00f3n del repositorio, en este caso, el contenido de este curso. (Nota que hay un punto, \".\", antes de \"git\". Eso corresponde a un archivo o directorio escondido.)\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejercicio 2:** (Desde el IJulia notebook) \u00bfQu\u00e9 hay dentro del directorio `.git`? (Hint: recuerden lo que hace `;` antes de una instrucci\u00f3n de linux.)" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Antes de seguir adelante, **conviene** que ejecuten los siguientes comandos, con los cambios apropiados a ustedes:\n", "```\n", "git config --global user.name \"Luis Benet\"\n", "git config --global user.email \"benet@fis.unam.mx\"\n", "git config --global color.ui \"auto\"\n", "```\n", "Estos comandos tienen como objetivo configurar la cuenta desde donde est\u00e1n trabajando. Los dos primeros sirven para que los cambios que hagan queden *debidamente firmados*, por as\u00ed decirlo; el \u00faltimo sirve para ver la vida de colores, desde la terminal :-)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para ver la situaci\u00f3n o *status* del repo, ejecutamos la instrucci\u00f3n\n", "```\n", "git status\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [ "; git status" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "On branch master\n", "\n", "Initial commit\n", "\n", "Untracked files:\n", " (use \"git add ...\" to include in what will be committed)\n", "\n", "\t.ipynb_checkpoints/\n", "\t01-git.ipynb\n", "\n", "nothing added to commit but untracked files present (use \"git add\" to track)\n" ] } ], "prompt_number": 5 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A fin de interpretar el contenido de la salida de \n", "```\n", "git status\n", "```\n", "empezaremos por definir ciertos t\u00e9rminos:\n", "\n", "- Cada punto de la *historia* de un repositorio se guarda en \"branches\" (ramas).\n", "- En el tiempo, el usuario puede decidir guardar una representaci\u00f3n de ese momento del desarrollo del proyecto. Cada uno de esas fotograf\u00edas del desarrollo se llaman *\"commits\"*, y el guardar la historia es *hacer un commit*, del ingl\u00e9s, *committing*." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Entonces, el resultado de `git status` indica:\n", "- Que estamos en la rama *master*; de ahora en adelante, en el branch master, que es el de default y, de hecho, el principal.\n", "- Que estamos en el *commit* inicial, es decir, que no se ha guardado ning\u00fan cambio a\u00fan en el repositorio.\n", "- Que hay dos archivos cuyos cambios, en este momento, no se est\u00e1n siguiendo: *untracked files*.\n", "- Y, lo m\u00e1s importante, **qu\u00e9 es lo que hay que hacer** para hacer que la historia de uno o varios archivos sea seguida. O sea, que esos archivos sean *tracked*: `(use \"git add\" to track)`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Vayamos paso a paso. Nos interesa seguir los cambios de \"01-git.ipynb\"; despu\u00e9s veremos c\u00f3mo se puede ignorar los cambios en \".ipynb-checkpoints/\". Entonces, siguiendo lo que nos dice, ejecutaremos:\n", "```\n", "git add 01-git,ipynb\n", "```\n", "\n", "Pero, **antes**, vale la pena salvar la situaci\u00f3n actual de este archivo. \n", "\n", "**NOTA** Yo har\u00e9 esto desde IJulia, pero puede ser m\u00e1s conveniente hacerlo desde la propia terminal; as\u00ed, uno evita hacer cosas que cambian este archivo. Si lo hacen desde la terminal, recuerden **no** poner el `;`." ] }, { "cell_type": "code", "collapsed": false, "input": [ "; git add 01-git.ipynb" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 6 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Mmmmmm... \n", "\n", "\u00bfPas\u00f3 algo? Veamos qu\u00e9 dice `git status`; nuevamente, es mejor hacerlo desde la terminal." ] }, { "cell_type": "code", "collapsed": false, "input": [ "; git status" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "On branch master\n", "\n", "Initial commit\n", "\n", "Changes to be committed:\n", " (use \"git rm --cached ...\" to unstage)\n", "\n", "\tnew file: 01-git.ipynb\n", "\n", "Untracked files:\n", " (use \"git add ...\" to include in what will be committed)\n", "\n", "\t.ipynb_checkpoints/\n", "\n" ] } ], "prompt_number": 10 }, { "cell_type": "markdown", "metadata": {}, "source": [ "A pesar de que a\u00fan **no** hemos guardado este punto en la historia del proyecto (`Changes to be committed:`), vemos que git ahora nos avisa de los cambios que ser\u00e1n hechos: se incluir\u00e1 el nuevo archivo `01-git.ipynb`. Y tambi\u00e9n, c\u00f3mo dar marcha atr\u00e1s a los cambios: `(use \"git rm --cached ...\" to unstage)`; pero esto lo dejaremos para m\u00e1s tarde.\n", "\n", "Para guardar este punto de la historia del proyecto ejecutaremos:\n", "```\n", "git commit -m \"Add 01-git.ipynb\"\n", "```\n", "Aqu\u00ed, la bandera `-m` avisa que escribiremos una l\u00ednea de mensaje, escrito entre comillas. Ese mensaje habla de los cambios que se hicieron (de manera resumida) y sirven como recordatorio. \n", "\n", "**NOTA**: De igual manera uno puede escribir la l\u00ednea de resumen y m\u00e1s detalles de los cambios que se guardan, cosa que obviamente es beneficiosa. Para esto \u00faltimo, uno ejecutar\u00eda `git commit` (sin ninguna bandera ni nada m\u00e1s); esto abrir\u00e1 un editor, por default \"vi\", donde escribiremos una l\u00ednea de resumen, y dejando un espacio en blanco, lo que queramos m\u00e1s detallado. Esto **conviene** hacerlo desde la terminal.\n", "\n", "Ver [aqu\u00ed](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html) para una gu\u00eda de \"buenas pr\u00e1cticas\" sobre c\u00f3mo escribir los mensajes en los commits; vale la pena leerlo!" ] }, { "cell_type": "code", "collapsed": false, "input": [ "; git commit -m \"Add 01-git.ipynb\"" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "[master (root-commit) 3225b9d] Add 01-git.ipynb\n", " 1 file changed, 315 insertions(+)\n", " create mode 100644 01-git.ipynb\n" ] } ], "prompt_number": 11 }, { "cell_type": "markdown", "metadata": {}, "source": [ "El mensaje indica que hemos hecho el primer commit, etiquetado \"3225b9d\", y que \u00e9ste incluye 315 inserciones. Esta etiqueta (que podr\u00eda ser otra para ustedes), que de hecho es una etiqueta abreviada, se llama \"hash\"." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejercicio 3:** \u00bfQu\u00e9 indica `git status` ahora?" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para saber m\u00e1s detalles de la historia del repositorio, o sea, echarle un ojo a la bit\u00e1cora (*log*), uno utiliza la instrucci\u00f3n \n", "```\n", "git log\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [ "; git log" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "commit 3225b9d8cbd4722805a73ede1c2fe4a247de82a9\n", "Author: Luis Benet \n", "Date: Mon Feb 2 18:27:27 2015 -0600\n", "\n", " Add 01-git.ipynb\n" ] } ], "prompt_number": 13 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Aqu\u00ed ven por qu\u00e9 arriba dije que la etiqueta es abreviada; tambi\u00e9n ven que yo hice los cambios, cuando, y mi email." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ " " ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Desde que hice el commit inicial, de hecho, *muuuuucho* he escrito. Para darme cuenta de ello, un simple `git status` basta y sobra. Ah\u00ed ver\u00e9 que el archivo `01-git.ipynb` ha sido modificado, y que \n", "`.ipynb_checkpoints/` aparece como *untracked*. Ahora, veremos c\u00f3mo hacer para que ciertos archivos simplemente no se consideren en la lista; en particular, que `.ipynb_checkpoints/` no aparezca nuevamente.\n", "\n", "Empecemos por crear el archivo `.gitignore` vac\u00edo; noten que es un archivo escondido: \n", "```\n", "touch .gitignore\n", "```\n", "\n", "Ahora, yo escribir\u00e9 desde la l\u00ednea de comandos `.ipynb_checkpoints` en ese archivo. Esto se logra con:\n", "```\n", "echo \".ipynb_checkpoints\" > .gitignore\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejercicio 4:** Creen un archivo que se llame `.gitignore` con el contenido arriba mencionado." ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Si todo va bien hasta aqu\u00ed, entonces podemos ver el contenido del archivo `.gitignore` con el comando `cat`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "; cat .gitignore" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ ".ipynb_checkpoints\n" ] } ], "prompt_number": 15 }, { "cell_type": "code", "collapsed": false, "input": [ "; git status" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "On branch master\n", "Changes not staged for commit:\n", " (use \"git add ...\" to update what will be committed)\n", " (use \"git checkout -- ...\" to discard changes in working directory)\n", "\n", "\tmodified: 01-git.ipynb\n", "\n", "Untracked files:\n", " (use \"git add ...\" to include in what will be committed)\n", "\n", "\t.gitignore\n", "\n", "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" ] } ], "prompt_number": 16 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Por un lado, he modificado el archivo \"01-git.ipynb\"; adem\u00e1s, hay un nuevo archivo que no est\u00e1 siendo seguido por git: `.gitignore`. El punto que **resaltar** es que el dichoso directorio `.ipynb_checkpoints` ya **no** aparece en la lista de los archivos que no se est\u00e1n siguiendo. Esto es justamente lo que hace el archivo `.gitignore`." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejercicio 5:** Agreguen ese archivo a la lista de los archivos que ser\u00e1n seguidos en el respositorio. \u00bfQu\u00e9 resulta dar `git status` despu\u00e9s de agregar ese archivo? Despu\u00e9s, hagan el commit relacionado a ese cambio. Para el mensaje del commit, \u00a1ejerciten su ingl\u00e9s!" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Ejercicio 6:** \u00bfQu\u00e9 hay nuevo en la salida de `git log`?" ] }, { "cell_type": "code", "collapsed": false, "input": [], "language": "python", "metadata": {}, "outputs": [] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora har\u00e9 un cambio trivial y no importante en \".gitignore\":" ] }, { "cell_type": "code", "collapsed": false, "input": [ "; echo \".DS_Store\" >> .gitignore" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 17 }, { "cell_type": "code", "collapsed": false, "input": [ "; git status" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "On branch master\n", "Changes not staged for commit:\n", " (use \"git add ...\" to update what will be committed)\n", " (use \"git checkout -- ...\" to discard changes in working directory)\n", "\n", "\tmodified: .gitignore\n", "\tmodified: 01-git.ipynb\n", "\n", "no changes added to commit (use \"git add\" and/or \"git commit -a\")\n" ] } ], "prompt_number": 18 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Claramente, `git` nota que ha habido cambios en ambos archivos: en \"01-git.ipynb\" son los cambios asociados con lo que voy escribiendo ---y que por lo mismo, evitaremos ir comentando---, y el cambio en \".gitignore\" que acabo de hacer. Para saber qu\u00e9 cambios he hecho en \".gitignore\" usamos\n", "el comando `git diff .gitignore`:" ] }, { "cell_type": "code", "collapsed": false, "input": [ "; git diff .gitignore" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ "diff --git a/.gitignore b/.gitignore\n", "index 763513e..b5f2b45 100644\n", "--- a/.gitignore\n", "+++ b/.gitignore\n", "@@ -1 +1,2 @@\n", " .ipynb_checkpoints\n", "+.DS_Store\n" ] } ], "prompt_number": 19 }, { "cell_type": "markdown", "metadata": {}, "source": [ "La informaci\u00f3n muestra que se agreg\u00f3 una l\u00ednea: `+.DS_Store` y su contenido. Cambios m\u00e1s complejos se se\u00f1alar\u00e1n de igual manera, pero no les recomiendo hacer esto con \"01-git.ipynb\". Incidentalmente, en la terminal las diferencias se ven con colores.\n", "\n", "Ahora, si por alguna raz\u00f3n queremos revertir los cambios, que por cierto justo ahora *no* hemos guardado, entonces, siguiendo las instrucciones que est\u00e1n en `git status`, ejecutamos:\n", "```\n", "git checkout -- .gitignore\n", "```" ] }, { "cell_type": "code", "collapsed": false, "input": [ "; git checkout -- .gitignore" ], "language": "python", "metadata": {}, "outputs": [], "prompt_number": 20 }, { "cell_type": "code", "collapsed": false, "input": [ "; cat .gitignore" ], "language": "python", "metadata": {}, "outputs": [ { "output_type": "stream", "stream": "stdout", "text": [ ".ipynb_checkpoints\n" ] } ], "prompt_number": 21 }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como se puede apreciar, hemos borrado los cambios en ese archivo y hemos vuelto al estado del \u00faltimo commit.\n", "\n", "Esto nos lleva a un comentario importante: si bien uno puede borrar un archivo con `rm archivo` desde la terminal, esto no implica que `git` deje de ser checando los cambios a ese archivo. Si uno quiere borrar un archivo y que tambi\u00e9n desaparezca de ser seguido por `git`, uno debe adem\u00e1s ejecutar:\n", "```\n", "git rm archivo\n", "```\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "**Resumiendo**, el ciclo t\u00edpico de desarrollo, desde el punto de vista de `git` es:\n", "\n", " > git status # ver cu\u00e1l es la situaci\u00f3n\n", " [Modificar archivos]\n", " > git status # revisar cambios\n", " > git add *archivo* # prepara los archivos que se cambiaron\n", " > git commit -m \"Mensaje\"\n" ] }, { "cell_type": "heading", "level": 1, "metadata": {}, "source": [ "3. Subiendo los cambios del repositorio" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una caracter\u00edstica de `git` es que permite subir los cambios en el repositorio a alg\u00fan servidor central o un directorio de uso compratido. En particular, permite subir los cambios a [GitHub](https://github.com), donde se puede tener un respaldo del repositorio de manera gratuita, siempre y cuando sea de c\u00f3digo abierto.\n", "\n", "Lo primero necesario, obviamente, es abrir una cuenta en GitHub, y entonces crear un nuevo repositorio; las instrucciones se encuentran [aqu\u00ed](https://help.github.com/articles/creating-a-new-repository/). Una vez que se ha creado el repositorio, GitHub explica los comandos que hay que usar para subir los cambios (*push*) a GitHub. \u00c9stos son:\n", "\n", " > git remote add origin https://github.com/NombreUsuario/Proyecto.git\n", " > git push -u origin master\n", " \n", "Aqu\u00ed, \"NombreUsuario\" es el nombre de identificaci\u00f3n ante GitHub (el suyo o el del desarrollador principal del repositorio), y \"Proyecto\" es el nombre del repositorio. Entonces, la primer instrucci\u00f3n define (configura) el lugar remoto donde se subir\u00e1n los cambios, en este caso a GitHub; la segunda instrucci\u00f3n *sube* los cambios del branch `master` del repositorio local al repositorio remoto.\n", "\n", "Por ahora dejaremos esto, pero eventualmente ser\u00e1 algo importante, sobretodo en la parte *colaborativa*." ] }, { "cell_type": "heading", "level": 2, "metadata": {}, "source": [ "Referencias" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "- La [documentaci\u00f3n](http://git-scm.com/doc) de git (cap\u00edtulo 2, por ahora).\n", "- [gitSimplified](http://www.gitguys.com/topics/).\n", "- [Think like (a) git](http://think-like-a-git.net).\n", "- Algunas [notas](http://nbviewer.ipython.org/github/computo-fc/fisica_computacional/blob/master/notas/Usando%20git/git%20b\u00e1sico.ipynb) de David Sanders sobre `git`" ] } ], "metadata": {} } ] }