Control de versiones con Git y GitHub

From FdIwiki ELP
Jump to: navigation, search

Control de versiones con Git

Introducción a Git

Git es un software de control de versiones diseñado por Linus Torvalds, pensando en la eficiencia y la confiabilidad del mantenimiento de versiones de aplicaciones cuando estas tienen un gran número de archivos de código fuente.

Se llama control de versiones a la gestión de los diversos cambios que se realizan sobre los elementos de algún producto o una configuración del mismo. Una versión, revisión o edición de un producto, es el estado en el que se encuentra dicho producto en un momento dado de su desarrollo o modificación.

Aunque un sistema de control de versiones puede realizarse de forma manual, es muy aconsejable disponer de herramientas que faciliten esta gestión dando lugar a los llamados sistemas de control de versiones o SVC (del inglés System Version Control).

Al principio, Git se pensó como un motor de bajo nivel sobre el cual otros pudieran escribir la interfaz de usuario o front-end como Cogito o StGIT. Sin embargo, Git se ha convertido desde entonces en un sistema de control de versiones con funcionalidad plena.

Hay algunos proyectos de mucha relevancia que ya usan Git, en particular, el grupo de programación del núcleo Linux.

En Git tendremos el directorio de trabajo, la staging area y el directorio git (repositorio).

  • En el directorio de trabajo, tendremos todos los archivos de nuestro proyecto, incluidos aquellos que no nos interesa mandar al repositorio.
  • La staging area es una zona o área de espera, a la que mandaremos los archivos que tenemos listos para actualizar en el repositorio.
  • El directorio git es dónde se almacenará el snapshot (imagen actual) de los archivos que están en la staging área.


Directorios dentro de la carpeta .git

Dentro de la carpeta .git tendremos varias subcarpetas algunas de ellas son las siguientes:

  • HEAD: para el registro de cabeceras.
  • branches: las diferentes versiones que vamos subiendo.
  • config: el archivo de configuración.
  • description: la descripción.
  • hooks: para la ejecución de scripts necesarios para funcionamiento de git.

Creación de un repositorio privado

Todos los comandos que vamos a ver se ejecutarán sobre Git Shell.

El git Shell, visto desde Windows, es un aplicación que abre un entorno de línea de comandos al estilo Linux. Nos permitirá ejecutar típicos comandos de Linux, como crear carpetas, borrar archivos, editar un archivo con vi, etc.

Para crear un repositorio privado, crearemos la carpeta del proyecto y a continuación inicializaremos el repositorio con el comando git init. Para ello abriremos el Git Shell, accederemos a la carpeta dónde vamos a grabar el proyecto y allí dentro ejecutaremos el comando git init.

Si queremos que cualquier carpeta sea un nuevo repositorio independiente de los otros, habrá que inicializarla con git init, sino formará parte del repositorio padre del que cuelga.

Clonando repositorios

Para hacer una copia (clon) de un repositorio, se realiza con una instrucción bastante sencilla. La instrucción git clone destino, realizará una copia del repositorio actual en el destino indicado.

Los branches (ramas)

Un branch (rama) es una versión de nuestro código. Git nos permite movernos entre versiones de forma sencilla.

La creación de ramas nos permite trabajar en diferentes versiones de un mismo archivo y cuando lo consideremos podremos fusionar los cambios.

Cada vez que creamos una rama, se crea un nuevo puntero a la versión indicada o a la que estamos trabajando. Se van a emplear los comandos git branch y git checkout.

Se definen fácilmente y no hace falta hacerlo a priori. Los podemos crear en cualquier momento.

Para saber en que versión nos encontramos, Git mantiene un puntero a la versión en la que estamos trabajando. Este puntero lo tiene referenciado en HEAD (dentro de la carpeta .git).

Definir un branch

Para definir un branch se utiliza el comando git branch y para cambiarnos a ese branch se utiliza el comando git checkout.

Podríamos definir un branch y cambiarnos inmediatamente utilizando git checkout -b nombre_branch:

Cómo cambiar de versión o branch

Podemos cambiarnos entre versiones o branches fácilmente. De esta forma podremos añadir o ver los cambios realizados fácilmente en cada una de las versiones.

ATENCION: Tenemos que tener en cuenta que se recomienda aplicar cambios en el branch en el que estamos trabajando, antes de cambiarnos a un branch distinto.

Con la instrucción git checkout nombre_branch nos cambiamos de rama (branch)

Instalación

Para instalar Git es muy sencillo.

Tendremos que acceder a la página: http://git-scm.com/download

Nos descargaremos la versión para nuestro sistema operativo y una vez instalado ya podremos crear un repositorio.

Podemos tener tres tipos diferentes de repositorio:

  • Privado (en nuestro equipo).
  • Externo (en un servidor externo).
  • Interno (en un servidor interno).

GitHub para el control de versiones

GitHub es un repositorio en línea que usa Git. Necesitamos lo siguientes requisitos antes de poder integrar GitHub con nuestro repositorio local:

  • 1.- Tendremos que instalar Git. NOTA: Existe más información de como realizar este proceso en: [Guía rápida de Github].
  • 2.- Tenemos que crear una cuenta en [GitHub].
  • 3.- Crearemos un nuevo repositorio en GitHub.
  • 4.- Configuraremos nuestro git para usar el repositorio de GitHub que hemos creado.

En Git, los archivos pueden encontrarse en los siguientes estados:

  • untracked: cuando no se ha añadido a ningún repositorio.
  • tracked: el fichero ha sido añadido a algún repositorio.
  • staged: el fichero ha sido añadido al repositorio, pero no ha sido enviado todavía con commit al repositorio.
  • modified: el fichero ha sido modificado.
  • unmodified: el fichero no ha sido modificado.
  • commited: el fichero ya ha sido actualizado en el repositorio.

El ciclo de vida de un archivo en el control de versiones será el siguiente:

  • En un principio cualquier nuevo archivo recién creado en nuestro directorio será un archivo untracked, por que no forma parte de ningún commit (actualización del repositorio).
  • Cuando añadimos el archivo al proyecto, será un archivo unmodified (ya que no se ha realizado ningún cambio sobre él). Pasará a ser modified cuando después de añadirlo, hayamos realizado algún cambio o edición sobre ese fichero.
  • Para que esos cambios pasen a formar parte del repositorio, hay que situarlo en la staging area (listos para ser actualizados) y entonces el archivo estará staged (listo para ser actualizado en el repositorio).
  • Por último al hacer el commit, todos los cambios se almacenarán en el repositorio.
  • A partir del commit, todo ese contenido pasará a ser unmodified y de nuevo el ciclo se repetirá.

Para saber más características sobre Github -> [Características Github]

Gitlab, la alternativa a Github

GitHub ha marcado un antes y un después en el modo de percibir el código abierto, la colaboración entre desarrolladores y cómo hacer "social" nuestro código. Pero GitHub tiene un pero: su modelo de negocio no nos permite tener repositorios privados, al menos en su versión gratuita.

Aquí es donde entra en juego GitLab, que sin entrar en detalles, nos proporciona repositorios privados, sin perder funcionalidades y con una interfaz muy ligera y cómoda.

GitLab es un proyecto de código libre que se puede instalar en tu propio servidor y que te permite tener repositorios privados, sin costo.

Este proyecto nació en Ucrania y poco a a poco se convirtió en un trabajo de tiempo completo para sus creadores; quienes hoy en día están abriendo oficinas en California y tienen clientes tan importantes como la NASA, AT&T y Alibaba.

Uno de sus puntos fuertes más destacable es que es 100% Open Source. Si quieres puedes revisar el código fuente de la aplicación y hacer modificaciones. Si piensas que tus cambios pueden servirle a la comunidad puedes hacer un merge request y sus desarrolladores los revisarán. Si tus cambios son una buena idea, serán incluidos.

Resumen y uso básico de Git por comandos

Un repositorio git esta compuesto por tres "árboles" administrados por git.

  • El primero es tu Directorio de trabajo que contiene los archivos.
  • El segundo es el Index que actua como una zona intermedia.
  • El último es el HEAD que apunta al último commit realizado.

Crear un repositorio

Para crear un repositorio:

  • 1.- Acceder a la carpeta que deseemos
  • 2.- Teclear git init
  • 3.- Se habrá creado una carpeta oculta .git que gestionará todas las copias y control de versiones.
git init

Comprobar modificaciones en el repositorio

git status

Notificar cambios al repositorio

git add nombrefichero
  • O podemos añadir TODOS los ficheros modificados tecleando:
git add .

Commit

git commit -m "Mi primer commit."
  • Si queremos enviar todos los ficheros modificados independientemente de si se han enviado a la

staging área usaremos el parámetro -a:

git commit -a -m "Mi primer commit con todos los archivos modificados."

Envío de cambios al repositorio remoto en GitHub

Nuestros cambios están en el HEAD local de nuestra máquina. Para enviar los cambios al repositorio remoto ejecutar:

git push origin master  (reemplazar master por la rama a dónde queremos enviar los cambios)

Configuración de Git para poder usar GitHub.com

  • Configuramos el nombre Global
git config --global user.name "Tu nombre"

  • Configuramos nuestro e-mail:
git config --global user.email pruebas@gmail.com

Añadir repositorio remoto de GitHub

  • Añadimos el repositorio remoto copiando la url de nuestro repositorio remoto a partir del parámetro origin:
git remote add origin git://github.com/usuario/repositorio.git

  • Una vez añadido el repositorio remoto podremos enviar nuestro repositorio local con el parámetro master es la referencia al branch que queremos subir.
git push -u origin master

  • Si queremos descargarnos el proyecto de ese repositorio lo haremos con el comando: git pull
git pull --all
  • Si queremos comprobar los repositorios remotos que tenemos configurados:
git remote
  • Si queremos ver las URL de esos repositorios remotos:
git remote -v 
  • Para obtener los datos del repositorio remoto:
git fetch 

Clonado de un repositorio remoto de GitHub.com a local

  • Accedemos al Git Bash, a la carpeta o unidad dónde queramos clonar.
  • Una vez allí dentro teclearemos el comando:
git clone github.com/usuario/repositorio.git

  • Si queremos que lo clone en un directorio distinto, haremos:
git clone github.com/usuario/repositorio.git nuevodirectorio
  • Si clonas un repositorio, el comando añade automáticamente ese repositorio remoto con el nombre de "origin".

Actualizar tu repositorio local al commit más nuevo

  • Ejecutar en el directorio de trabajo para bajar y fusionar con los cambios remotos.
git pull

Revertir los cambios de un commit concreto

  • Vemos el log de los commit:
git log --pretty=oneline
  • Para revertir el commit escribiremos:
git revert 

Éste cambio teóricamente no afectará a los commits siguientes. Deshace todo lo que se hizo en el commit identificado. pero mantiene todo lo que se ha hecho después de éste. El commando revert hace un nuevo commit, que se podría volver a deshacer.

Volver a una versión anterior de Git perdiendo lo posterior a ese commit

  • Vemos el log de los commit:
git log --pretty=oneline
  • Si queremos volver a como estaba todo cuando hicimos el commit 1 (perdiendo lo posterior al commit 1)
git reset --hard 
  • No hacer git push al directorio remoto por que perderemos todo lo que teníamos.
  • Para volver al presente basta con hacer un git pull. De esta forma se sincronizará el local con el contenido del repositorio remoto