Ejemplos y recetas

Veamos como crear un repositorio git para trabajar con nuestros archivos de código fuente, y las operaciones básicas de las que disponemos para interactuar con el repositorio.

Inicializar un repositorio

# Creamos un directorio y un archivo
mkdir helloworld
cd helloworld
echo "Hello World" > README

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

Añadir archivos al repositorio y realizar el primer commit

git add README
git commit -d "First commit"

Enlazar con un repositorio remoto

Imaginaros ahora que queremos que nuestro repositorio local recien creado se comunique con un repositorio remoto. Definiremos para ello un remote, con lo cual podremos empezar a realizar comandos pull/fecth, y si tenemos permiso, también push.

git remote add origin git@gitlab.micronautas.com:testing.git
git push -u origin master

Obtener un repositorio remoto

Normalmente no partimos de cero en nuestro repositorio, sino que ya existe (por ejemplo en github.com). Si quisiéramos obtener una copia local de ese repositorio remoto, estableciendo además automáticamente el remote a ese repositorio, utilizaremos el siguiente comando:

$ git clone git@github.com:tombatossals/git-puesto-en-practica.git
Cloning into 'git-puesto-en-practica'...
remote: Counting objects: 293, done.
remote: Compressing objects: 100% (258/258), done.
remote: Total 293 (delta 123), reused 197 (delta 27)
Receiving objects: 100% (293/293), 3.13 MiB | 234 KiB/s, done.
Resolving deltas: 100% (123/123), done.
$ cd git-puesto-en-practica/
$ git branch
 * master
$ git remote -v
origin  git@github.com:tombatossals/git-puesto-en-practica.git (fetch)
origin  git@github.com:tombatossals/git-puesto-en-practica.git (push)

Permisos de acceso a un repositorio remoto

Los proyectos de software libre suelen tener permisos de lectura sin autenticación (p.e. en github), pero para obtener permisos de escritura deberemos autenticarnos de alguna manera. Primero que nada, deberemos configurar git para que envíe nues

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

Listando los últimos cambios del repositorio

Listemos ahora los últimos cambios que se han producido en el repositorio, es decir, los últimos commits que han realizado los desarrolladores del repositorio:

$ git log --oneline
fbcf1a6 Optimized for ipad
9c0a361 Some minor changes
7d8ccd7 Renamed project
81716a8 Some cosmetic changes, and finished the second presentation.
fde35e7 Lot of changes
e7286e0 Working as team slides already finished
b0c3a69 More slides
...

Obtener los últimos cambios del repositorio remoto

Veamos ahora cómo obtener todos los últimos cambios del repositorio remoto haciendo un fetch.

$ git branch -a
* master
  remotes/origin/master
$ git fetch
remote: Counting objects: 13, done.
remote: Compressing objects: 100% (5/5), done.
remote: Total 8 (delta 3), reused 8 (delta 3)
Unpacking objects: 100% (8/8), done.
From github.com:tombatossals/unimajors
   0486878..d0f88cc  master     -> origin/master
$ git diff origin/master
diff --git a/2011-iim/sesion01/images/alineacion.jpg b/2011-iim/sesion01/images/alineacion.jpg
deleted file mode 100644
index 93d68ae..0000000
Binary files a/2011-iim/sesion01/images/alineacion.jpg and /dev/null differ
diff --git a/2011-iim/sesion01/images/espaciado.jpg b/2011-iim/sesion01/images/espaciado.jpg
deleted file mode 100644
index c902e4a..0000000
Binary files a/2011-iim/sesion01/images/espaciado.jpg and /dev/null differ
diff --git a/2011-iim/sesion01/index.html b/2011-iim/sesion01/index.html
index 5210ff5..b1d02f8 100755
--- a/2011-iim/sesion01/index.html
+++ b/2011-iim/sesion01/index.html
@@ -287,14 +287,14 @@
       <article class='fill'>
         <h3></h3>
+        <img alt="Tipo de fuente" src="images/font.jpg" />
       </article>
 
       <article>
$ git merge origin/master
Updating 0486878..d0f88cc
Fast-forward
 2011-iim/sesion01/images/alineacion.jpg |  Bin 0 -> 138057 bytes
 2011-iim/sesion01/images/espaciado.jpg  |  Bin 0 -> 86800 bytes
 2011-iim/sesion01/index.html            |    6 +++---
 3 files changed, 3 insertions(+), 3 deletions(-)
 create mode 100644 2011-iim/sesion01/images/alineacion.jpg
 create mode 100644 2011-iim/sesion01/images/espaciado.jpg

Examinar el historial de cambios de un archivo

Podemos examinar todo el historial de cambios de un archivo mediante este comando:

git log --follow -p <archivo>

Crear una nueva rama en el repositorio remoto

git push origin origin:refs/heads/new-feature

Diferencias entre 2 ramas de nuestro proyecto

Para obtener las diferencias de 2 ramas de nuestro proyecto podemos utilizar este comando:

git diff master..experiment

Manejar etiquetas (tags)

Podemos gestionar etiquetas en nuestros proyectos de una manera muy sencilla, lo que nos ayudará a registrar de manera cómodo e intuitiva los puntos vitales de la evolución de nuestro proyecto.

Listar tags:
git tag
Crear un nuevo tag en el commit actual:
git tag -a v1.4 -m 'Versión 1.4'
Crear un nuevo tag en un commit pasado:
$ git tag -a v1.2 9fceb02

Crear una rama local en el repositorio remoto:

Es un comando un tanto extraño, si tenemos una rama local llamada "desarrollo" podemos enviarla al repositorio remoto origin
git push origin origin:refs/heads/desarrollo

Averiguar quién hizo qué cosa en un archivo: git blame.

$ git blame site.yaml
9e34c40d (David Rubert 2011-12-09 09:25:04 +0100  1) handlers:
7d8ccd71 (David Rubert 2011-12-22 19:43:37 +0100  2) - url: '/primeros-pasos/'
7d8ccd71 (David Rubert 2011-12-22 19:43:37 +0100  3)   static_files: 'primeros-pasos/index.html'
9e34c40d (David Rubert 2011-12-09 09:25:04 +0100  4)   upload: '.*'
7d8ccd71 (David Rubert 2011-12-22 19:43:37 +0100  5) - url: '/trabajando-en-equipo/'
7d8ccd71 (David Rubert 2011-12-22 19:43:37 +0100  6)   static_files: 'trabajando-en-equipo/index.html'
e7286e0d (David Rubert 2011-12-18 18:04:07 +0100  7)   upload: '.*'
e6d6195b (David Rubert 2012-01-08 22:12:17 +0100  8) - url: '/autenticacion-y-hosting/'
e6d6195b (David Rubert 2012-01-08 22:12:17 +0100  9)   static_files: 'autenticacion-y-hosting/index.html'
e6d6195b (David Rubert 2012-01-08 22:12:17 +0100 10)   upload: '.*'
6f0dd636 (David Rubert 2012-01-12 23:13:47 +0100 11) - url: '/ejemplos/'
6f0dd636 (David Rubert 2012-01-12 23:13:47 +0100 12)   static_files: 'ejemplos/index.html'
fde35e7f (David Rubert 2011-12-18 23:51:40 +0100 13)   upload: '.*'
9e34c40d (David Rubert 2011-12-09 09:25:04 +0100 14) - url: '/'
9e34c40d (David Rubert 2011-12-09 09:25:04 +0100 15)   static_files: 'index.html'
9e34c40d (David Rubert 2011-12-09 09:25:04 +0100 16)   upload: '.*'
9e34c40d (David Rubert 2011-12-09 09:25:04 +0100 17) - url: '/'
9e34c40d (David Rubert 2011-12-09 09:25:04 +0100 18)   static_dir: '/'

Servidor web con instaweb

Podemos arrancar un servidor web que nos permita navegar el contenido de nuestro repositorio de una manera más amigable, para ello deberemos tener instalado lighttpd o cualquier otro servidor web compatible y ejecutar:

git instaweb

Para que no nos aparezca el mensaje de Unnamed repository:

echo "Mi proyecto" > .git/description

Veremos algo así:

Para pararlo:

git instaweb --stop