Aprendiendo a usar Git

Git es un sistema de control de código fuente adoptado por la comunidad Drupal durante la creación de Drupal 7. ¿Qué es un sistema de control de código fuente? Es cualquier herramienta que permita a los desarrolladores administrar cambios en documentos, código fuente y otras colecciones de información.

Si alguna vez has hecho cambios en un documento o en un código y después deseas poder volver atrás en el tiempo y deshacer esos cambios, un sistema de control de versiones habría guardado el día.

Esa es una de las características clave del control de código fuente: la capacidad de tomar una instantánea de activos digitales en un momento dado y luego recuperar esa instantánea en una fecha posterior para restaurar el estado anterior.

Otros aspectos clave de un sistema de control de versiones incluyen la capacidad de distribuir cambios a otros desarrolladores o sistemas y la capacidad de tomar una única base de código y crear copias (o ramas, el término más técnicamente correcto) de esa base de código para que múltiples desarrolladores puedan trabajar simultáneamente sin frustrar el trabajo de otro y, en algún momento, fusionar todas esas ramas con la capacidad de resolver conflictos en los que dos personas realizan cambios en los mismos elementos de un activo digital (ej. una línea de código).

Hay varios sistemas de control de versiones en el mercado. El seleccionado y adoptado por la comunidad Drupal es Git. Linus Torvalds, el creador del sistema operativo Linux, creó Git durante la creación de Linux mientras buscaba algo que fuera verdaderamente de código abierto, rápido y potente, pero fácil de usar. En este capítulo veremos algunas de las funciones básicas de Git que puede que desees utilizar en tu nuevo sitio de Drupal 8.

1.Instalación de Git

El primer paso en el uso de Git es instalarlo. Pero antes de instalarlo, comprueba si ya está instalado tecleando git en el símbolo del sistema en una ventana de terminal y presionando Return. Si ves una lista de comandos de Git, felicidades, ya tienes Git instalado. Si aparece algo como “comando no encontrado”, entonces es hora de instalar Git.

1.1.Instalación de Git en Linux

La instalación de Git en Linux es un proceso sencillo de un solo paso. Si estás en una distribución basada en Debian como Ubuntu, el comando a ingresar en un terminal es apt-get install git. Si estás en un sistema no basado en Debian, puedes utilizar yum para instalar Git introduciendo yum install git-core en el terminal.

Después de instalar, escribe git en el terminal y pulsa Return. Ahora deberías ver una lista de comandos de Git. Si no es así, consulta la documentación útil en el sitio web de Git en http://git-scm.com.

1.2.Instalación de Git en OS X

La instalación de Git en OS X se realiza a través del instalador gráfico que está disponible en http://sourceforge.net/projects/git-osx-installer. Esta herramienta sencilla de usar proporciona una forma rápida de instalar Git en tu Mac. Descarga el archivo dmg, haz clic en él para iniciar el instalador y sigue las instrucciones. Una vez instalado, prueba que Git está instalado iniciando una ventana de terminal y escribiendo git en el símbolo del sistema y presionando Return. Deberías ver una lista de comandos de Git. Si no es así, visita http://git-scm.com para obtener ayuda.

1.3.Instalación de Git en Windows

Para instalar Git en Windows, descarga el archivo exe del instalador de Git desde http://msygit.github.io. El instalador de Windows instala las herramientas de Git que te permiten ejecutar comandos de Git desde una consola e instala una herramienta GUI para administrar tus repositorios de Git. Después de instalar, inicia un terminal, ingresa git y pulsa Enter. Deberías ver una lista de comandos de Git. Si no es así, visita http://msygit.github.io para obtener ayuda.

2.Uso de Git

Hay varios comandos básicos de Git que te impulsarán a convertirte en usuario de Git. El primer paso en el proceso de uso de Git es configurar un repositorio de Git donde se almacenarán todos los elementos que deseas colocar bajo control de versiones. Utilizando un terminal, navega al directorio raíz de la instalación de Drupal 8. En el terminal, escribe git init y presiona Return.


Nota: El comando git init devolverá un mensaje de error si ya has creado un repositorio Git para este sitio.


Deberías ver algo similar a este mensaje:

Initialized empty Git repository in /Applications/MAMP/htdocs/drupal8/.git/

Si el repositorio no se ha creado correctamente, visita el sitio web de Git para obtener ayuda sobre errores específicos.

Con el repositorio creado, el siguiente paso es agregar elementos al repositorio. Dado que aún no hemos añadido ningún archivo, agregaremos todos los archivos de nuestro directorio de Drupal 8 a Git. Para ello, ingresa el siguiente comando:

git add -A.

Asegúrate de introducir el punto al final del comando, ya que significa el directorio actual. Si agregaste correctamente todos los archivos a tu repositorio, deberías volver al símbolo del sistema sin ningún mensaje. Si ingresas git status en el terminal y presionas Return, deberías ver una larga lista de archivos nuevos que se agregaron al repositorio pero aún no se han confirmado.

El proceso de validación de los archivos que se acaba de agregar proporciona una instantánea que se puede volver a realizar en caso de que hagas cambios en el futuro y necesites volver a un estado anterior. La frecuencia con la que agregas y envías los archivos depende de tí, el punto clave es que, para tener la capacidad de retrotraer a un punto anterior, estos archivos deben haber sido agregados y comprometidos. Así que confiemos nuestros archivos de Drupal 8 a nuestro repositorio de Git usando el siguiente comando:

git commit -m “initial commit to the repository”

Después de ejecutar el comando commit, deberías ver una larga lista de mensajes de que se crearon nuevos nodos en el repositorio de Git, un mensaje por archivo confirmado. Si ejecutas el comando git status, debes ver que todo está actualizado:

# On branch master
nothing to commit, working directory clean

En este punto hemos comprometido los archivos y ahora tenemos la capacidad de revertir los archivos al estado en que estaban cuando los entregamos hace unos momentos. El siguiente paso en el proceso es agregar cambios a los archivos y confirmar esos cambios. Hagamos un cambio a un archivo existente y agreguemos un nuevo archivo para ver cómo Git responde a ambas situaciones. Primero, crea un nuevo archivo en tu directorio sites/default/files. Para fines de demostración, crea un nuevo archivo llamado test.txt con unas pocas líneas de información para que podamos ver Git en acción. Después de crear el archivo, ejecuta git status para verificar que Git reconoció el nuevo archivo. Deberías ver una salida similar a:

# On branch master
# Untracked files:
#	(use “git add <file>...” to include in what will be committed)
#
#	test.txt

Así que sigamos las instrucciones y usemos git add test.txt para agregar el archivo a Git. Después de agregar el archivo, utiliza el git status para comprobar que el archivo se ha agregado. Deberías ver una salida similar a:

# On branch master
# Changes to be committed:
#	(use “git reset HEAD <file>...” to unstage)
#
#	new file: test.txt
#

Donde new file: se añadió al nombre del archivo para indicar que Git está ahora rastreando ese archivo.

Entreguemos el nuevo archivo al repositorio para que tengamos la capacidad de volver al estado actual en el futuro. Utiliza el siguiente comando para validar el archivo:

git commit -m “committing the initial version of test.txt to the repository”

Después de la entrega, ejecuta git status para ver que todo está comprometido. Deberías ver el mensaje indicando que no hay nada que entregar.

Ahora cambiemos el archivo test.txt añadiendo más información a él para ver si Git ve los cambios en el archivo. Después de agregar texto a tu archivo, ejecuta git status. Deberías ver un mensaje similar a:

# On branch master # Changes not staged for commit: # (use “git add <file>...” to update what will be committed) # (use “git checkout – <file>...” to discard changes in working directory) # # modified: test.txt #

Git reconoció los cambios en test.txt. Ahora podemos agregar la versión modificada de test.txt y validarla usando:

git add test.txt y git commit -m “modified test.txt”

Después de confirmar, utiliza el comando git log para ver el historial de las confirmaciones en tu repositorio. Debes ver dos confirmaciones para el archivo que entregaste, parecidas a lo siguiente:

commit d4c24ca1854e5367617814be86246b1a3cb0a1a
Author: Linus Torvalds
<linus@linux.com>
Date: Web Mar 19 08:27:10 2014 -0700
modified test.txt
commit 39b5859fa60d1aafacd5c04d7695e715fdfd6bd6
Author: Linus Torvalds
<linus@linux.com>
Date: Wed Mar 19 08:23:04 2014 -0700
committing the initial version of test.txt to the repository

Verás en la lista anterior que hay dos ID de confirmación diferentes. Si necesitas revertir test.txt a su estado inicial, puedes hacerlo utilizando el ID de confirmación inicial. El comando para revertir a un commit anterior es git revert <commit id>. Para revertir el ejemplo usaríamos el primer ID, el que termina en bd6:

git revert 39b5859fa60d1aafacd5c04d7695e715fdfd6bd6

Después de revertir y comprobar el archivo test.txt, podemos ver que el archivo está de nuevo a su estado original antes de hacer cambios en él.

Ahora tienes suficiente información básica para configurar tu repositorio local de Git y almacenar tus cambios, pero todos tus cambios se almacenan localmente en tu computadora, y es posible que desees habilitar a otros para ver y/o hacer cambios en tu repositorio.

Hay varias soluciones para proporcionar acceso a tu repositorio de Git, incluyendo una de las soluciones más populares, GitHub, que es la que veremos en este capítulo.

3.Uso de GitHub

GitHub te permite compartir tus repositorios Git con otros y facilita situaciones en las que estás desarrollando en tu computadora y tu sitio reside en un servidor remoto. En cualquiera de estos escenarios, GitHub proporciona un entorno accesible a través de Internet, y si estás de acuerdo con que el público en general tenga acceso a tus repositorios, el servicio es gratuito. Por una pequeña cuota mensual puedes actualizar a una cuenta de GitHub que proporciona repositorios privados que sólo son accesibles para aquellos a los que has concedido derechos de acceso. Para fines de demostración, utilizaremos la versión gratuita de GitHub. Si aún no tienes una cuenta, visita https://github.com y regístrate para obtener una nueva cuenta.

Después de configurar tu cuenta, el primer paso es crear un repositorio. En la página de destino de GitHub (una vez que hayas iniciado sesión), verás uno o más enlaces y botones para crear un repositorio. Haz clic en uno de los enlaces y verás una página similar a la figura 16-1.

Figura 16-1.

Para crear un repositorio, introduce un nombre en el campo “Nombre del repositorio”, introduce una descripción en el campo Descripción y, en la lista de selección “Añadir .gitignore”, selecciona Drupal.

Un archivo .gitignore contiene los nombres de los archivos que deseas que Git no rastree. En el caso de Drupal, hay archivos de configuración locales como settings.php que son específicos del entorno local donde se está ejecutando el sitio. Al ignorar settings.php evitarás tener que modificar elementos como la configuración de la base de datos cada vez que extraes del repositorio maestro.

Con el repositorio creado en GitHub, el siguiente paso es enviar tu repositorio local a GitHub. En la página GitHub de tu repositorio, verás una URL clonada en la columna derecha de la página. Copia esa URL, ya que la necesitarás para enviar tu repositorio local hasta GitHub.

El primer paso en el proceso es configurar la conexión GitHub en tu máquina local. Desde el directorio raíz de tu sitio Drupal 8, utiliza el siguiente comando para agregar una referencia a tu repositorio remoto de GitHub, recordando pegar la URL clonada en lugar de <clone url from GitHub>:

git remote add origin <clone url from GitHub>

Una vez que hayas agregado el repositorio remoto, el siguiente paso es eliminar todos los cambios que existen en GitHub que no existen localmente, antes de intentar enviar tu repositorio local a GitHub. Si intentas enviar cambios a GitHub y hay cambios remotos que no existen localmente, Git te dirá que tu rama es anterior y primero tienes que bajar los cambios. Dado que hemos añadido un archivo .gitignore en GitHub, el repositorio remoto tiene cambios que nuestra copia local no tiene. Así que para solucionarlo, utiliza lo siguiente:

git pull origin master

Esto eliminará todos los cambios que existan en GitHub y los fusionará en nuestro repositorio local.

El siguiente paso en el proceso es enviar nuestro repositorio local hasta GitHub, ya que GitHub ahora está básicamente vacío. Utiliza el siguiente comando para enviar nuestro sitio Drupal 8 hasta el repositorio remoto:

git push origin master

Después de enviar nuestros cambios, nuestros repositorios locales y remotos estarán sincronizados. A medida que agregues archivos o cambies archivos en tu repositorio local, tendrás que enviarlos hasta GitHub para que otros tengan acceso.

El proceso es relativamente sencillo:

  1. Utilizando git status, comprueba si los archivos locales se han agregado a la instancia de Drupal 8 o qué archivos se han modificado.

  2. En la lista de adiciones y cambios, utiliza git add <filename> para agregar cada uno de los archivos a Git, reemplazando <filename> por los nombres reales de los archivos enumerados por git status. Si tienes varios archivos en un único directorio que se han agregado o cambiado, puedes realizar las mismas tareas agregando el directorio en el que residen los archivos utilizando git add <directory>.

  3. Configura tus cambios localmente usando git commit -m “some message that describes the changes you are committing”. Puede confirmarse después de agregar cada archivo o puedes confirmarlo una vez que hayas agregado todos los archivos agregados o modificados. Depende de la granularidad de lo que se desea revertir en caso de un problema. En la mayoría de casos, comprometerlos después de agregarlos (el grupo de archivos) es lo adecuado.

  4. Después de que los archivos se han entregado localmente, es hora de enviarlos a GitHub. Para enviar los cambios, utiliza git push origin master. Si hay varias personas trabajando en tu repositorio GitHub, puedes encontrar una situación en la que al intentar enviar archivos aparece un error que indica que tu rama principal es anterior a X número de confirmaciones. Simplemente ejecuta git pull para descargar y fusionar esos cambios y luego vuelve a ejecutar git push origin master. En situaciones en las que ha cambiado un archivo que también ha sido cambiado por otra persona, Git informará que hay un conflicto de combinación. Git escribe información útil en el archivo donde se produjo el conflicto de combinación. Examina el archivo y resuelve los problemas. Para más información sobre la resolución de conflictos de combinación, visita la documentación de http://git-scm.com/documentation.

Con tu sitio Drupal 8 cargado en GitHub, ahora puedes proporcionar acceso a otras personas a tu repositorio para que puedan descargar y, opcionalmente, confirmar cambios en tu repositorio. Si has actualizado tu cuenta de GitHub, tendrás que conceder acceso a tu repositorio siguiendo los pasos enumerados en la página de destino de tu repositorio de GitHub. Si no has actualizado tu cuenta, no tendrás que hacer nada para conceder acceso porque, de forma predeterminada, las cuentas gratuitas son de acceso público. Para clonar tu repositorio GitHub en un ordenador, puedes utilizar el comando git clone o descargar el archivo zip del repositorio mediante el botón Descargar ZIP en la página de destino de tu repositorio.

El mejor enfoque es usar Git y clonar el repositorio. Para ello, simplemente copia la URL clonada de HTTPS que aparece en la columna derecha de la página y ejecuta el siguiente comando:

git clone <clone URL> <target directory>

Reemplazando <clone URL> por la URL real que aparece en la página de destino del repositorio de GitHub. Por ejemplo:

Deberías clonar el repositorio de GitHub en un directorio llamado drupal8. Después de la clonación, podrías usar, modificar, añadir al repositorio y, opcionalmente, volver a enviar estos cambios al repositorio de GitHub. Hay una gran cantidad de documentación sobre cómo administrar un repositorio Git multi-desarrollador en el sitio web de Git, incluyendo temas como la creación de ramas separadas en las que los desarrolladores pueden trabajar en cambios que se vuelven a fusionar en la rama principal cuando estén listos para hacerlo.

4.Uso de Git en Drupal.org

También puedes utilizar Git para clonar Drupal mismo o módulos y temas. Mientras que Drush (ver capítulo 15) hace que descargar y actualizar módulos y temas sea sencillo, puede haber ocasiones en las que desees aportar cambios al núcleo de Drupal o a algún módulo o tema aportados. Para ello, es necesario que utilices Git y aportes los cambios a Drupal.org, el repositorio de un módulo o el repositorio de un tema.

Siguiendo los pasos descritos anteriormente en este capítulo para crear un clon de un repositorio remoto, visita www.drupal.org/project/drupal y haz clic en el vínculo “Control de versiones” en la parte superior de la página. En la página resultante, verás instrucciones sobre cómo clonar el repositorio. Ese mismo enlace de “Control de versiones” aparece en la parte superior de la página de destino de cada módulo o tema en Drupal.org. También puede clonar el repositorio de un módulo o tema siguiendo los mismos pasos descritos anteriormente. Para obtener directrices sobre cómo contribuir código a la comunidad, visita www.drupal.org/contribute/development.