31 de marzo de 2016

Mini-tutorial de Git

En este minitutorial de Git daremos un recorrido de cómo usar Git y cuales son sus comandos básicos. Git es una de las herramientas básicas en el desarrollo de aplicaciones web, así como lo es Xdebug, PHPUnit y PHING (estos últimos específicos en PHP).

Git es un popular sistema de control de versiones disponibles como servicios en la Web (en modalidad de pago o gratuitamente), por ejemplo: GitHub y BitBucket.

Git es una herramienta poderosa en el manejo del control de versiones, que permite llevar un seguimiento de los cambios de nuestros archivos en un proyecto determinado, incluso sin estar conectado a un servidor de control de versiones propiamente tal, como sucede en otras herramientas de este tipo.

En la práctica, la forma de trabajar con Git es mediante el uso de las ramas (branch), donde tendremos básicamente:

  • Rama Master (master): es la rama donde que llevará el seguimiento de los archivos que mantienen el código estable del proyecto.
  • Ramas de Desarrollo: son las ramas que creamos en la medida que vamos agregando nuevas funcionales o sencillamente haciendo un proceso de refactorización del código.

Instalar Git

Para chequear si Git se encuentra instalado en el sistema, se requiere abrir una consola bash y ejecutar el comando:

git —version

Si Git no se encuentra instalado en nuestro equipo, podemos descargarlo desde:
https://git-scm.com/downloads

Git está disponible para los siguientes sistemas operativos: Windows, Mac OS X, Linux y Solaris.

Configuración de básica de Git

Si Git se encuentra instalado, podemos ver la configuración de Git actual mediante el comando:

git config —list

Para establecer una nueva configuración, podemos hacerlo indicándole a Git si deseamos hacerlo a nivel de sistema (--system), a nivel de usuario (--global), o a nivel de proyecto.

Si deseamos establecer una nueva configuración de Git a nivel de usuario, que es lo tradicional, señalando los parámetros de nombre de usuario y su correo electrónico, entonces desde una consola bash ejecutamos los comandos:

git config —global user.name ‘My Nombre'
git config —global user.email my@email.com

Para chequear si la nueva configuración ha tenido efecto, usamos:

git config —list

Finalmenta, aunque no es parte de la configuración de Git propiamentetal, es muy recomendable establecer una llave SSH para usarlo como identificación al momento que trabajemos con repositorios Git remotos, situación que en algún momente sucederá. La llave SSH se genera con el comando:

ssh-keygen

También es posible saber si existe una llave SSH creada previamente, si estamos en Mac OS X entonces en nuestra carpeta de usuario aparecerá un directorio oculto de nombre ‘.ssh’

Inicializar un repositorio Git

Los proyectos se manejan en carpetas (directorios) y es en la raiz de esa carpeta donde ejecutamos el comando parar inicializar un repositorio Git para ese proyecto:

git init

Si nuestro proyecto se lozaliza en la carpeta C:/wamp/www/mi_primer_proyecto/, entonces en esa carpeta debemos inicializar Git git init y así crear un repositorio Git local para ese proyecto.

Para conocer el estado del repositorio se usa la instrucción:

git status

También es posible iniciar un repositorio desde un repositorio remoto Git. Esto se puede efectuar usando distintos protocolos de comunicación (http, https, ssh), lo habitual es usar el protocolo SSH, en ese caso si tenemos un repositorio en BitBucket y contamos con los permisos para clonar ese repositorio, entonces nos podemos ubicar por ejemplo, en la carpeta C:/wamp/www/ y ejecutamos la instrucción en una consola bash:

git clone git@bitbucket.org:mi_username_en_bitbucket/nombre_proyecto.git

En la cuenta de BitBucket debemos colocar la parte pública de nuestra llave SSH, para de esta forma BitBucket reconozca nuestra petición como válida y autorizada.

Establecer archivos para seguimiento en Git

Conocer el estado del repositorio lo hacemos mediante la instrucción:

git status

Para agregar archivos al próximo commit (una especie de snapshot de la rama en un repositorio):

git add nombre_archivo

Para agregar todos los archivos a un nuevo commit:

git add -A

Crear un commit:

git commit -m 'aquí va el comentario informativo de ese commit'

En el ciclo de vida de un repositorio suceden muchos commits, si necesitamos visualizar los commits:

git log --oneline --decorate

Para volver a alguno de los commits anteriores y recuperar la carpeta del proyecto a un estado anterior:

git checkout codigo_numerico_del_commit

Podemos asignarle un Tag al commit actudal de modo de usar el Tag en vez de código numérico generado por Git:

git tag nombre_de_la_tag_creada

También es posible asignarle un nombre a un commit cualquiera usando la instrucción:

git tag nombre_de_la_nueva_tag codigo_numerico_del_commit

Para mostrar todos los tags:

git tag

Si queremos volver al útimo commit de la rama usamos:

git checkout nombre_de_la_rama

Trabajando con Ramas

Mostrar las ramas presentes en el repositorio:

git branch

Mostar todas las ramas incluso las remotas:

git branch --all

La rama prefijada con asterisco (*) en su nombre, es la forma que tiene Git para indicarnos la rama en la cual estamos posicionados actualmente.
Crear una rama a partir de una cualquiera, basta con posicionarnos en una rama cualquiera y ejecutar la orden.

git branch nombre_de_la_nueva_rama

Cambiar de ramas en Git:

git checkout nombre_rama

Fusionar ramas, nos posicionamos en una rama y elegimos otra rama la cual deseamos fusionar con la actual:

git merge nombre_rama_a_fusionar

Eliminar la rama, para llevar a cabo la operación debemos estar fuera de la rana que vamos a eliminar:

git branch -d nombre_de_rama_a_borrar

Trabajando con repositorios remotos

Agregar un repositorio remoto Git que se ubique localmente:

git remote add origin /c/wamp/www/repositorio

La instrucción anterior se aplica en Windows cuando usamos la terminal bash que nos provee Git.

O clonar un repositorio de remoto usando SSH, para tal efecto es necesario disponer de claves SSH en nuestro sistema y disponer de la llave pública de esa misma clave en el sistema que administra el repositorio remoto.

git clone git@bitbucket.org:mi_user/nombre_proyecto.git

Para generar las claves se usa ’ssh-keygen’, como ya se mencionó anteriormente.

Agregar los cambios del repositorio remoto en nuestro repositorio local:

 git pull origin master

Si no queremos perder los cambios de nuestro repositorio local al hacer el pull del repositorio remoto, entonces usamos:

 git pull --rebase

Enviar los cambios a un repositorio remoto:

git push origin master

Por defecto, git denomina ‘origin’ al repositorio remoto.

Otras utilidades básicas de Git

Eliminar el seguimiento (tracking) de un archivo que ya se encuentra en el repositorio:

git rm --cached mi_archivo.txt

Es habitual definir un archivo llamado ‘.gitignore’ en la raiz de la carpeta al inicio del proyecto, para informale a Git acerca de los archivos y carpetas a las cuales no se les hará seguimiento. Es decir, deshabilita el control de versiones para esos archivos y carpetas por parte de Git, en general se trata de archivos de caché o similares.

Eliminar un directorio que ya se encuentra trackeado en el repositorio:

git rm -r --cached mi_directorio

Hay que tener cuidado con el uso de las instrucciones del tipo ‘git -rm –…’, pues son de caracter destructivo.

Conclusiones

Es este ha sido un vistazo a nivel general de las instrucciones básicas que debemos conocer para ser operativos con Git usando solamente una terminal bash.

Referencias

Remover el archivo de la historia de todos los branch del repositorio: https://help.github.com/articles/remove-sensitive-data/
Homepage de Git: https://git-scm.com
Servicio online de repositorios Git:

Manual de Git en versión PDF: https://git-scm.com/book/en/v2