Introducción


Git http://git-scm.com

Git es un software de control de versiones distribuido pensado para la eficiencia y confiabilidad del mantenimiento de versiones de aplicaciones cuando éstas tienen un gran número de archivos de código fuente.

El diseño de Git resulta de la experiencia del diseñador de Linux, Linus Torvalds, manteniendo una enorme cantidad de código distribuido y gestionado por mucha gente, que incide en numerosos detalles de rendimiento.

Características

El creador de Git: Linus Torvalds El mantenedor del proyecto: Junio Hamano

Cambia de foto con las teclas: y

Plataformas

¿En qué plataformas funciona Git?

Instalación

La instalación de Git en Linux dependerá de la plataforma, pero suele ser un proceso trivial ya que viene empaquetado en todas las distribuciones.

# En Ubuntu/debian
$ sudo apt-get install git-core

# En Archlinux
$ sudo pacman -S git

En Windows o MacOSX se utiliza un instalador visual, es decir, que es también muy sencillo.

Correspondencias con Subversion


Git Subversion
git add <file> svn add <file>
git rm <file> svn rm <file>
git mv <file> svn mv <file>
git diff svn diff | less
git log svn log | less
git status svn status
git commit -a svn commit
git clone <url> svn checkout <url>
git checkout <path> svn revert <path>
git branch <branch-name> svn copy <url1> <url2>

Atención: necesito vuestra concentración 5 minutos

El índice (staging area)


El índice de Git es una zona intermedia que almacena los cambios que queremos hacer efectivos en el próximo commit, es decir, una zona a medio camino entre el repositorio local y tu directorio de trabajo.

Lo utilizaremos para construir un commit que agrupe modificaciones en varios archivos.

Cuando hagamos el commit, se enviarán los cambios que hayamos especificado en el índice, que no tiene por qué coincidir con lo que haya en nuestro directorio de trabajo.


El comando que nos muestra la información sobre el estado del índice es git status.

Ejemplo de un 'git status'

Los "snapshots"


Diferencia fundamental con respecto al modo de trabajar de otros SCM. Git trabaja almacenando instantáneas de un conjunto de archivos modificados (y planificados a través del índice). Otros sistemas de control de revisiones trabajan a nivel de archivo individual.


En cada instantánea los cambios que se mandan al repositorio al hacer el commit son los de aquellos archivos planificados en el índice.

Flujo de información simplificado

Imagen del libro progit.org

Directorio de trabajo limpio


Un directorio de trabajo limpio es aquel en el que no tenemos ningún archivo modificado con respecto al último commit, ni tenemos ningún archivo planificado para el próximo commit en el índice.

[~/git-puesto-en-practica]$ git status
# On branch master
nothing to commit (working directory clean)

Comandos básicos


Inicializar un repositorio

git init. Es el comando que nos permite iniciar el control de versiones sobre un directorio.

# Creamos un directorio y un archivo
$ mkdir helloworld
$ cd hellworld
[~/helloworld]$ echo "Hello World" > README

# Inicializamos el repositorio
[~/helloworld]$ git init
Initialized empty Git repository in /home/dave/helloworld/.git/

Clonar un repositorio

git clone. Este comando obtiene una copia local de un repositorio remoto.

# Clonamos el repositorio fuente de esta presentacion
$ git clone git@github.com:tombatossals/git-puesto-en-practica.git
Cloning into 'git-puesto-en-practica'...
remote: Counting objects: 49, done.
remote: Compressing objects: 100% (40/40), done.
remote: Total 49 (delta 11), reused 44 (delta 6)
Receiving objects: 100% (49/49), 425.79 KiB | 117 KiB/s, done.
Resolving deltas: 100% (11/11), done.

$ cd git-puesto-en-practica/
[~/git-puesto-en-practica]$ ls
500.html  css  first  fonts  images  index.html  js  README.md

El directorio .git


El directorio de trabajo es muy limpio, la única referencia que veremos al sistema de control de versiones es un directorio .git ubicado en el directorio principal del proyecto.

Cosas que os van a llamar la atención al clonar y trabajar sobre un repositorio Git:

Operaciones básicas

add/rm/mv. Son las operaciones más básicas sobre archivos en el repositorio respecto al directorio de trabajo.

# Añadir un archivo local al repositorio
[~/git-puesto-en-practica]$ git add 404.html

# Mover un archivo a otro directorio (también renombrar)
[~/git-puesto-en-practica]$ git mv TODO first-steps/

# Borrar un archivo del repositorio y local
[~/git-puesto-en-practica]$ git rm hola

Obtención de diferencias

Tenemos tres posibles maneras de hacer un diff.

git diff. Nos muestra las diferencias de los cambios que todavía no hemos planificado para el próximo commit.


git diff --cached. Nos muestra las diferencias de los cambios planificados para el próximo commit con respecto al repositorio.


git diff HEAD. Compara el directorio de trabajo y el último commit al repositorio.

Ejemplo de un 'git diff' Ejemplo de un 'git diff --cached' Ejemplo de un 'git diff HEAD'

Cambia de foto con las teclas: y

Configuración global

git config. Establece algunas variables básicas de trabajo, que se trasladarán al archivo de configuración de usuario.

$ git config --global user.name "Peter Pan"
$ git config --global user.email "peter.pan@nuncajamas.com"
$ git config --global color.ui true

# Se modifica el archivo de configuración global de git
$ cat $HOME/.gitconfig 
[user]
    name = Peter Pan
    email = peter.pan@nuncajamas.com
[color]
    ui = true

Enviando al repositorio local


git commit. Envía una transacción al repositorio local con todos los cambios planificados en los archivos del índice. Es habitual enviar un comentario con los cambios hechos en el commit.

[~/git-puesto-en-practica]$ git commit
[master 1495512] New slides, and demo commit for the slides
 3 files changed, 79 insertions(+), 28 deletions(-)

Tenemos un commando especial para vagos, que es: git commit -a, que enviará todos los cambios a aquellos archivos que ya estaban en el repositorio, aunque no los hayamos añadido explícitamente al índice.

Revertir los cambios previstos

git reset HEAD. Limpia todos aquellos archivos y cambios que se habían planificado en el índice para el próximo commit.

[dave@inuik git-puesto-en-practica]$ git reset HEAD
Unstaged changes after reset:
M   first-steps/index.html

Podemos quitar del índice un único archivo si así lo queremos, especificando el nombre del archivo al final del comando: git reset HEAD -- file.cfg. Los dos guiones -- delimitan el final de las opciones del comando y el inicio de los paths de archivo.

Ejemplo de un 'git commit'

Continuará...