El Increíble Git II. Hola mundo


Hola una vez más, luego de una pequeña charla relacionada con las ventajas de usar un VCS, es hora de hacer algo práctico con Git. Primero lo primero, necesitamos instalarlo en nuestra estación de trabajo. Git está disponible para el trío de los sistemas operativos disponibles en los ordenadores actuales: OS X, Linux y Windows. Esta es una gran ventaja, pues al ser multiplataforma no está atado a ningún sistema operativo (SO en adelante), por lo que no interesa el SO que usas, Git está disponible para ti.

Instalación en OS X

En cualquier versión de este SO se puede instalar Git a través de su instalador gráfico, el cual puedes descargar desde Google Code. Durante la instalación, asegúrate de seleccionar la opción que te permite añadir Git al “path”, esto te garantizará el poder ejecutarlo desde la consola con el comando git sin importar el directorio en que te encuentres.

Instalación en Gnu/Linux

El paquete de instalación de Git en linux se llama “git-core”. En dependencia de la distribución que estés usando puedes instalarlo usando tu gestor de paquetes favorito o preferiblemente desde la consola. Si estás en Ubuntu o derivados (dígase Linux Mint, Kubuntu, Xubuntu etc) lo realizas de esta forma:

apt-get install git-core

En debian puedes utilizar el comando anterior o bien aptitude install git-core. Desde Fedora puedes hacerlo con yum:

yum install git-core

Para los amantes de la excelente distribución OpenSuse pueden instalarlo con:

zypper install git-core

Luego de instalado, al igual que en OS X, puedes utilizarlo desde cualquier directorio con el comando git.

Instalación en Windows

Para este SO existe un paquete muy popular llamado MSysGit (disponible en http://code.google.com/p/msysgit), este es un ejecutable que instala Git en el sistema y además crea opciones en el menú contextual (al dar clic derecho sobre alguna carpeta) para abrir la Shell o la GUI (término del inglés, Graphical User Interface) desde ese lugar. Demás está decir que automáticamente agrega el ejecutable al “path” de Windows. Si tienes curiosidad sobre el significado de “agregar el ejecutable al path del sistema operativo” puedes consultar un artículo donde se explica al detalle.

Git portable en Windows

Para este SO cuentas con una opción adicional, y es que existe una versión portable de MSysGit, lo que te permite no tener que instalarlo e incluso llevarlo en una memoria USB para otras estaciones de trabajo. Esto te permite poder trabajar en tus proyectos versionados con Git incluso si en dicha estación no cuentas con permisos administrativos. Para utilizar esta versión portable de Git solo debes ejecutar cualquiera de los dos scripts que se encuentran en la raíz del directorio (git-bash.bat, git-cmd.bat).

Bien, luego de explicados los pasos para la instalación de Git en estos SO, creo que no tienes escusas para no seguir leyendo :).

Hola mundo en Git

Imagina que cuentas con un proyecto web que tiene la siguiente estructura:

Estructura del proyecto a versionar

Fig. 1: Estructura de la aplicación a versionar.

Para versionar dicho proyecto en Git basta con dirigirse a la carpeta webapp (Clic derecho / Abrir Shell de Git) y escribir el comando:

git init

Este comando crea un directorio llamado “.git” que contendrá el histórico de todo lo que vayas haciendo en el proyecto. Este directorio se crea en la raíz de cada proyecto que quieras gestionar con Git, lo que te permite tener ajustes independientes para cada proyecto.

Ajustes iniciales

No te asustes, los ajustes iniciales no son más que tus datos personales, como tu nombre y tu email, para que Git pueda conocer quién creó qué versión y en qué momento. Esto es especialmente útil cuando hay varias personas colaborando entre sí en un mismo proyecto. Los siguientes comandos le dicen a Git quién eres. El parámetro –global lo empleo para decirle que utilice estos datos no solo en el presente proyecto, sino en los siguientes que incluya a partir de este momento. Sin la opción –global, estos ajustes solo servirán para el proyecto “webapp”.

git config --global user.name "Mycyberacademy"

git config --global user.email "mca@gmail.com"

Hecho esto puedes comenzar a gestionar tu proyecto con Git, si echamos un vistazo a cómo ve Git nuestros archivos en este momento, ejecutamos el comando: git status, que generará la siguiente salida:

Fig. 2: Verificando el estado del proyecto

Si lees la última línea puedes observar que traducido al español dice: “No se ha añadido nada para versionar (o sea, hacer commit), pero existen archivos sin seguimiento” y entre paréntesis, te dice que ejecutes el comando git add para seguir los archivos. Esto es así porque inicialmente, aunque inicializamos el proyecto con git, éste no tiene ninguna versión del proyecto guardada, lo que significa que si haces cambios ahora mismo, no podrás volver atrás a un estado anterior.

Precisamente queremos lo contrario, por lo que vamos a hacerle “seguimiento a los archivos” (tracked files, denominación en inglés). Para hacer track a todos los archivos del proyecto ejecutamos lo siguiente:

git add .

El símbolo punto significa “selecciona todo”, pero puedes hacerlo individualmente archivo por archivo, por ejemplo: git add index.html. Para mostrar cómo se ve el repositorio con archivos en seguimiento y sin seguimiento, ejecuta este último comando en vez del primero, y verifica el status nuevamente. Debe aparecer algo como lo siguiente:

Verificando el estado del repositorio Git

Fig. 2: Verificando el estado del proyecto

Si lees la última línea puedes observar que traducido al español dice: “No se ha añadido nada para versionar (o sea, hacer commit), pero existen archivos sin seguimiento” y entre paréntesis, te dice que ejecutes el comando git add para seguir los archivos. Esto es así porque inicialmente, aunque inicializamos el proyecto con git, éste no tiene ninguna versión del proyecto guardada, lo que significa que si haces cambios ahora mismo, no podrás volver atrás a un estado anterior.

Precisamente queremos lo contrario, por lo que vamos a hacerle “seguimiento a los archivos” (tracked files, denominación en inglés). Para hacer track a todos los archivos del proyecto ejecutamos lo siguiente:

git add .

El símbolo punto significa “selecciona todo”, pero puedes hacerlo individualmente archivo por archivo, por ejemplo: git add index.html. Para mostrar cómo se ve el repositorio con archivos en seguimiento y sin seguimiento, ejecuta este último comando en vez del primero, y verifica el status nuevamente. Debe aparecer algo como lo siguiente:

Añadiendo el archivo al stage area

Fig. 3: Estado del proyecto luego de añadir un archivo

Como puedes ver, el archivo index.html se muestra separado del grupo anterior, con letras en color verde. Esto significa que ya Git conoce que este archivo existe. Corrección, Git conoce todos los archivos, pues como puedes ver, sabe diferenciar los que están en seguimiento y los que no :). Por tanto, puedes inferir de la idea anterior que index.html es un archivo en seguimiento, y que está listo para que se guarden versiones de él cada vez que queramos.

La idea anterior es importante, pues con lo que hemos hecho el archivo está en seguimiento, pero no tiene la primera versión registrada aún (eso lo haremos enseguida). Debes aprender de Git, que con cada acción que ejecutas, el propio Git te muestra sugerencias de comandos que hacen lo contrario a la acción que ejecutaste. En este caso añadimos index.html al “área de seguimiento” o staging area (término en inglés), o sea, el archivo está staged. El mismo comando que ejecutó esta acción te muestra cómo quitarle el seguimiento al archivo, justo arriba de la línea verde de la imagen anterior puedes ver que te sugiere lo siguiente:

Use "git rm --cached <file>..." to unstage

Por lo que si ejecutas este comando reemplazando “<file>” por index.html el proyecto estará en su estado inicial, o sea, el archivo se deja de seguir. Conocer estas simples cosas es vital para comenzar a utilizar Git, y por eso me he tomado el trabajo de explicarlo al detalle.

Mi primera versión del proyecto

Lo último que haremos será la acción más común que harás en Git y constituye la función principal del software, “versionar el proyecto“. Vamos a decirle a Git que el proyecto así como está, sin nada escrito, va a ser la versión cero, el estado inicial. Esto lo logras ejecutando el siguiente comando, que por sí es auto descriptivo:

git commit -m "Estado cero del proyecto, nada se ha hecho"

El parámetro -m indica un comentario para esta versión, y es muy útil que siempre escribas uno donde describas qué fue lo que hiciste o lograste avanzar. La salida del comando muestra lo siguiente, y es muy importante que comprendas qué fue lo que se hizo:

Creando la primera versión

Fig. 4: Primer commit al proyecto

Lo importante aquí es la penúltima línea, la cual dice que un archivo se cambió y que se adicionaron 10 líneas de texto en total. Esto es así pues el archivo index.html contiene el maquetado básico de una página web, que ocupa exactamente 10 líneas, y fue el único archivo que se modificó.

Bien, vamos a evolucionar, crearé otra versión del proyecto haciendo un nuevo commit, pero antes, modificaré el archivo README.md añadiéndole una sola línea y luego le haré seguimiento. Esto se logra ejecutando lo siguiente LUEGO de modificar el archivo:

git add REAMDE.md

git commit -m "Añadí la primera línea al README.md"

Bravo, ya tenemos DOS versiones del proyecto. Observa qué poder, no hemos duplicado ningún archivo, ni hemos anotado fechas, sin embargo, dentro de 6 meses, cuando ni recuerdes lo que hiciste por esta fecha, podrás ver a través de Git qué día y a qué hora se crearon estos commit, los autores que lo hicieron, el contenido que fue introducido/eliminado en cada uno de ellos e incluso revertir el estado del proyecto a cualquiera de ellos y ver cómo se comportaba el software en ese momento. ¿Increíble no?

Conclusiones

Bien, esto es todo por ahora, en la siguiente parte aprenderás cómo hacer todas estas cosas que menciono en el párrafo anterior (no te preocupes, no tendrás que esperar seis meses) y comenzarás a entender ¿por qué Git? y cuáles son los elementos que lo hacen diferente a otros VCS como Subversion.