Taller Git que impartimos Francisco Gortázar (@fgortazar) y Micael Gallego (@micael_gallego) en la Escuela Técnica Superior de Ingeniería Informática de la URJC.
2. Who are we?
• Francisco Gortázar
(aka Patxi)
▫ Desarrollador Java
▫ Co-fundador 2ndepisode
▫ Formador
Java, Spring, Maven, JVM...
▫ Siempre mejorando los
procesos de desarrollo
▫ Actualmente jugando el
rol de devop en 2nd
▫ Profesor e investigador
en @urjc
3. Who are we?
• Micael Gallego (aka
Mica)
▫ Desarrollador Java
▫ Scrum Máster y
Arquitecto en
Kurento.org
▫ Profesor y formador
▫ Investigador @urjc:
Algoritmos de
optimización
4. Who are we?
• Sidelab
▫ Laboratorio donde
probamos algunas de
nuestras ideas locas sobre
desarrollo software
▫ scstack
https://github.com/sidelab-
urjc/scstack
▫ optsicom-framework
https://github.com/gortazar/
optsicom-framework
▫ optsicom-remote-
experiment-system
https://github.com/sidelab-
urjc/optsicom-remote-
execution-system
5. Introducción
• Git es un SCM
distribuido (DSCM)
▫ Cada desarrollador tiene
una copia del repositorio
▫ No hay concepto de
repositorio centralizado
Ya… pero al final suele
haberlo
8. Introducción
• Características: Integridad
Los commits se identifican por un hash sha1
Svn: rev 33
Git: d025a7b3217f05110ebbf48065b8d02a0ad22ae3
O más amigablemente: d025a7b
Los ficheros también se identifican por su sha1
Si un fichero se corrompe durante la transmisión por
la red se detecta inmediatamente
9. Introducción
• Características: Los 4 estados
Los ficheros en git pueden estar en cuatro estados:
Untracked: el fichero no está bajo “control” de git
Tracked: el fichero está bajo “control” de git, y puede
estar en uno de los siguientes tres estados:
Modificado: el fichero ha cambiado desde el último
checkout
Staged: un fichero modificado ha sido marcado para ser
añadido en el próximo commit
Committed: el fichero se encuentra en la base de datos
de git
11. Introducción
• Características: Las 3 áreas de un proyecto git
El directorio git (git directory)
Contiene los metadatos y la base de datos de git
Es lo que se copia cuando se clona un repositorio
Normalmente es una carpeta .git en algún directorio
La carpeta de trabajo (working directory)
Es un checkout de una versión específica del proyecto
Se extrae del directorio git
Es el espacio donde modificamos los ficheros
Staging area
Fichero en el directorio .git que indica qué cambios van en
el próximo commit
12. Introducción
• Características: La identidad
Git necesita conocer algunos datos del desarrollador
(aparecen en los commits para identificar al autor)
Nombre
Email
Si no están correctamente configurados… atente a las
consecuencias
Los commits fallan porque el usuario no está autorizado
Commits del mismo usuario “físico” no son considerados
como del mismo usuario porque el nombre “lógico”
cambia
15. Introducción
• Características: La identidad (y 3)
Who am I?
patxi@patxi-PORTEGE-R830:~$ git config --list
user.name=patxigortazar
user.email=patxi.gortazar@gmail.com
16. Introducción
• Clientes git
En Eclipse
Egit (viene por defecto en las últimas versiones)
CLI Linux client
sudo apt-get install git
gitg, gitk
Windows
Msysgit: http://msysgit.github.com/
Tortoise Git (requiere msysgit):
http://code.google.com/p/tortoisegit/wiki/Download
Mac
SourceTree: http://www.sourcetreeapp.com/
Gitbox (simple): http://www.gitboxapp.com/
17. Comenzando
• Crear un repositorio en local
$ mkdir myrepo && cd myrepo
myrepo$ git init
Initialized empty Git repository in
/home/patxi/git/myrepo/.git/
myrepo$ git status
# On branch master
#
# Initial commit
#
nothing to commit (create/copy files and use
"git add" to track)
18. Comenzando
• Crear un fichero
myrepo$ echo “Hi, git” > README.md
myrepo$ git status
# On branch master
# Initial commit
# Untracked files:
# (use "git add <file>..." to include in
what will be committed)
# README.md
nothing added to commit but untracked files
present (use "git add" to track)
19. Comenzando
• Añadir el fichero
myrepo$ git add README.md
myrepo$ git status
# On branch master
#
# Initial commit
#
# Changes to be committed:
# (use "git rm --cached <file>..." to
unstage)
#
# new file: README.md
22. Pongámonos serios
• Generación de claves
Generar claves para acceso a repositorios remotos
Ubuntu
ssh-keygen -t rsa
Copiar el contenido del fichero ~/.ssh/id_rsa.pub en la
configuración de nuestra cuenta de github
Windows
Git bash
ssh-keygen.exe
Copiar el contenido del fichero c:/documents and
settings/<usuario>/.ssh/id_rsa.pub
23. Pongámonos serios
• Crear un repositorio en github
Inicializarlo con un README
• Clonar un repositorio (usar ssh)
myrepo$ git clone git@github.com:gortazar/mygithubrepo.git
Cloning into 'mygithubrepo'...
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 0 (delta 0)
Unpacking objects: 100% (3/3), done.
$ cd mygithubrepo
mygithubrepo$
24. Pongámonos serios
• Clonar el repositorio remoto tiene consecuencias:
El repositorio local guarda localmente información
sobre el repositorio remoto (llamado por defecto
“origin”)
Esto permite subir/bajar cambios al/desde repositorio
remoto
Las ramas refs/heads/* del repositorio remoto se
almacenan en el repositorio local como
refs/remotes/origin/*
Ver .git/config
26. Pongámonos serios
• Hacer algunos cambios
$ echo "Some change" >> README.md
$ git status
# 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: README.md
no changes added to commit (use "git add" and/or "git
commit -a")
27. Pongámonos serios
• Y commit
$ git add README
$ git commit -m “Improved doc”
$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)
28. Pongámonos serios
• Subir cambios al repositorio remoto
$ git push origin
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 313 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:gortazar/mygithubrepo.git
f0b5ef1..6c2373a master -> master
29. Pongámonos serios
• Traer cambios del repositorio remoto
$ git status
# On branch master
nothing to commit (working directory clean)
$ git fetch
remote: Counting objects: 5, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From github.com:gortazar/mygithubrepo
6c2373a..ae87f75 master -> origin/master
30. Pongámonos serios
• Traer cambios del repositorio remoto
$ git status
# On branch master
# Your branch is behind 'origin/master' by 1 commit, and
can be fast-forwarded.
#
nothing to commit (working directory clean)
$ git pull origin
Updating 6c2373a..ae87f75
Fast-forward
another_file.txt | 1 +
1 file changed, 1 insertion(+)
create mode 100644 another_file.txt
31. Pongámonos serios
• ¿Qué pasa si dos desarrolladores suben
cambios?
$ echo “New file A” > fileA.txt
$ git add fileA.txt
$ git commit -m “New file A added”
$ git push
32. Pongámonos serios
• ¿Qué pasa si dos desarrolladores suben
cambios?
$ echo “New file B” > fileB.txt
$ git add fileB.txt
$ git commit -m “New file B added”
$ git push
To git@github.com:gortazar/mygithubrepo.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to
'git@github.com:gortazar/mygithubrepo.git'
To prevent you from losing history, non-fast-forward
updates were rejected
Merge the remote changes (e.g. 'git pull') before pushing
again.
33. Pongámonos serios
• ¿Qué pasa si dos desarrolladores suben
cambios?
$ git pull
remote: Counting objects: 11, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 8 (delta 2), reused 8 (delta 2)
Unpacking objects: 100% (8/8), done.
From github.com:gortazar/mygithubrepo
bd63f2d..6834389 master -> origin/master
Merge made by the 'recursive' strategy.
fileA.txt | 2 ++
1 file changed, 2 insertions(+)
create mode 100644 fileA.txt
34. Pongámonos serios
• ¿Qué pasa si dos desarrolladores suben
cambios?
$ git log --oneline
f677bf3 Merge branch 'master' of
github.com:gortazar/mygithubrepo
bd63f2d New file B added
00cb814 File A added
6566348 Fixed appendix
e4f1f88 Apendice
24d5588 Adenda
ae87f75 Master diverged...
6c2373a Improved doc
f0b5ef1 Initial commit
35. Pongámonos serios
• ¿Qué pasa si dos desarrolladores suben
cambios?
No olvidemos subir el merge
$ git push
36. Pongámonos serios
• ¿Qué pasa si hay conflictos?
$ echo “Adenda” >> another_file.txt
$ git add another_file.txt
$ git commit -m “Adenda”
$ git push
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 317 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:gortazar/mygithubrepo.git
ae87f75..24d5588 master -> master
37. Pongámonos serios
• ¿Qué pasa si hay conflictos?
$ echo “Apendice” >> another_file.txt
$ git add another_file.txt
$ git commit -m “Apendice”
$ git push
To git@github.com:gortazar/mygithubrepo.git
! [rejected] master -> master (non-fast-forward)
error: failed to push some refs to
'git@github.com:gortazar/mygithubrepo.git'
To prevent you from losing history, non-fast-forward
updates were rejected
See theMerge the remote changes (e.g. 'git pull') before
pushing again.
'Note about fast-forwards' section of 'git push --help'
for details.
38. Pongámonos serios
• ¿Qué pasa si hay conflictos?
Usamos git pull para mezclar los cambios
$ git pull
remote: Counting objects: 6, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0)
Unpacking objects: 100% (3/3), done.
From github.com:gortazar/mygithubrepo
ae87f75..24d5588 master -> origin/master
Auto-merging another_file.txt
CONFLICT (content): Merge conflict in another_file.txt
Automatic merge failed; fix conflicts and then commit the
result.
39. Pongámonos serios
• ¿Qué pasa si hay conflictos?
git status nos dice cómo solucionarlo
$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 1 different commit each, respectively.
#
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark
resolution)
#
# both modified: another_file.txt
no changes added to commit (use "git add" and/or "git
commit -a")
40. Pongámonos serios
• ¿Qué pasa si hay conflictos?
Arreglamos los ficheros con conflictos
A different file
<<<<<<< HEAD
Apendice
=======
adenda
>>>>>>> 24d5588fcc559da7135932a3a364596b6a772364
A different file
Apendice
adenda
41. Pongámonos serios
• ¿Qué pasa si hay conflictos?
Con git add indicamos que solucionamos el conflicto
Commit, push y listo
$ git add another_file.txt
$ git commit -m “Fixed appendix”
$ git push
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 646 bytes, done.
Total 6 (delta 0), reused 0 (delta 0)
To git@github.com:gortazar/mygithubrepo.git
24d5588..6566348 master -> master
42. Ramas y tags
• Creación de ramas
$ git checkout -b cool_feature
Switched to a new branch 'cool_feature'
$ git status
# On branch cool_feature
nothing to commit (working directory clean)
43. Ramas y tags
• Hacer algún cambio
$ echo "puts 'Hola, mundo'" > hola.rb
$ git add hola.rb
$ git commit -m "Added my first ruby code"
[cool_feature 6a3a19d] Added my first ruby code
1 file changed, 1 insertion(+)
create mode 100644 hola.rb
$ git status
# On branch cool_feature
nothing to commit (working directory clean)
44. Ramas y tags
• ¿Queremos compartir la rama?
$ git push -u origin cool_feature
Counting objects: 4, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 316 bytes, done.
Total 3 (delta 0), reused 0 (delta 0)
To git@github.com:gortazar/mygithubrepo.git
* [new branch] cool_feature -> cool_feature
46. Ramas y tags
• Obtener una rama remota
$ git checkout cool_feature
Branch cool_feature set up to track remote branch
cool_feature from origin.
Switched to a new branch 'cool_feature’
47. Ramas y tags
• Crear un tag
Básicamente es darle nombre a un commit
Hay dos versiones
Tags ligeros:sólo contienen el nombre del tag
Tags pesados: contienen además el nombre del
committer y un mensaje
48. Ramas y tags
• Crear un tag ligero
$ git tag v1.0
$ git show v1.0
commit 6a3a19dcf6beb4ddcc0c707a6d31fd7b18cdfed5
Author: Francisco Gortazar <patxi.gortazar@gmail.com>
Date: Mon Mar 17 18:03:35 2014 +0000
Added my first ruby code
...
49. Ramas y tags
• Crear un tag pesado
$ git tag -a v1.0pesado -m "Un tag pesado"
$ git show v1.0pesado
tag v1.0pesado
Tagger: Francisco Gortazar <patxi.gortazar@gmail.com>
Date: Mon Mar 17 18:30:56 2014 +0000
Un tag pesado
commit 6a3a19dcf6beb4ddcc0c707a6d31fd7b18cdfed5
Author: Francisco Gortazar <patxi.gortazar@gmail.com>
Date: Mon Mar 17 18:03:35 2014 +0000
Added my first ruby code
50. Ramas y tags
• Mostrar la lista de tags
• Empujar los tags al repositorio remoto
$ git tag
v1.0
v1.0pesado
$ git push origin v1.0
Total 0 (delta 0), reused 0 (delta 0)
To git@github.com:gortazar/mygithubrepo.git
* [new tag] v1.0 -> v1.0
51. Ramas y tags
• Las ramas y los tags son referencias a commits
específicos
• Hay una referencia especial que es HEAD
52. Ramas y tags
• Cuando hacemos checkout cambiamos el
commit al que apunta HEAD
53. Comandos útiles
• Comandos útiles
git help <comando>
git log
Información de los commits
git log -p -2
Información de lo que ha cambiado en los últimos dos
commits
git log --graph --all
git log --oneline
54. Comandos útiles
• Deshacer acciones
git commit --amend
Sustituir el último commit por uno nuevo
Un amend pueda cambiar:
El mensaje del commit
Los ficheros del commit (añadiendo nuevos ficheros al
staging area antes de hacer git commit --amend)
Para deshacer acciones en el pasado:
http://sidelab.wordpress.com/2013/10/26/arreglando-
el-historico-en-git/
57. Git en Eclipse
• Prerequisitos
STS 3.4.0
http://www.springsource.org/downloads/sts-ggts
Escoger la opción basada en Eclipse 4.3
Incluye Egit y Maven
58. Git en Eclipse
• Clonar el repositorio
Eclipse
PerspectivaGit repository exploring
Clone a git repository URI
git@github.com:gortazar/mygithubrepo.git
59. Git en Eclipse
• Crear un proyecto Java
org.filetransfer
Crear un fichero de versión en la raíz
Version.txt 0.1
Crear un fichero SFTPTransfer en el paquete
org.filetransfer
60. Git en Eclipse
• Compartir el proyecto en git
Añadirlo al repositorio git del proyecto filetransfer
Team > Share project… > Git
Repository: mygithubrepo
61. Git en Eclipse
• Añadir los ficheros para que Eclipse haga
tracking de los mismos
Team > Add to index
62. Git en Eclipse
• Commit!
▫ Sobre el proyecto >Team
> Commit…
▫ El comentario es
obligatorio
▫ Chequear
Que el autor es el correcto
Que están marcados los
ficheros adecuados
Que no está marcada la
casilla “Push the changes to
upstream”
63. Git en Eclipse
• Añadir algún método más a la clase
Hay ficheros no añadidos al staging area no se
hará commit de ellos
64. Git en Eclipse
• Podemos añadir los
ficheros manualmente
▫ Botón derecho >Team >
Add to index
• En Eclipse esto se hace
automáticamente al
hacer commit
65. Git en Eclipse
• Subir cambios al repositorio remoto (push)
En este momento el repositorio local se encuentra
“a 2 commits” del repositorio remoto
66. Git en Eclipse
• Subir cambios al repositorio remoto (push)
Sobre el proyecto >Team > Push to upstream
67. Git en Eclipse
• Crear un branch para la versión
Sobre el proyecto >Team > Switch to > New branch…
From: refs/heads/development
Branch name: release-0.1
Asegurarse de que checkout new branch está activado
• El código del workspace señala ahora la versión
release-0.1
Hacer algún cambio
Commit
68. Git en Eclipse
• Cambiar en la rama develop la versión a 0.2
Sobre el proyecto >Team > Switch to > develop
Modificar el fichero version.txt
Commit
Push to upstream
69. Git en Eclipse
• Hacer un tag
Tag en la rama release-0.1
Team > Advanced >Tag > 0.1.0-RC1
Team > Remote > Push… > Next > Add all tags spec
Build/test/deploy…
70. Git en Eclipse
• Obtener cambios del repositorio remoto (pull)
Sobre el proyecto >Team > Fetch from upstream
Obtiene el índice de cambios
Sobre el proyecto >Team > Pull
71. Git en Eclipse
• ¿Qué pasa si otro desarrollador subió cambios
que entran en conflicto con los míos?
A modifica el constructor
B modifica el constructor de otra manera diferente
A y B hacen push del repositorio
El último que llega está obligado a hacer un pull y
resolver los conflictos
73. Git en Eclipse
• ¿Qué pasa si otro desarrollador subió cambios
que entran en conflicto con los míos?
Obtener los cambios
Team > Fetch from upstream
Team > Pull
Los cambios se mezclan y git marca los conflictos
74. Git en Eclipse
• ¿Qué pasa si otro desarrollador subió cambios
que entran en conflicto con los míos?
Corregir (mezclar)
Añadir la mezcla
git add
git commit
git push
76. Herramientas de gestión de Proyectos
• Además del repositorio de código, los desarrolladores
necesitan más herramientas para gestionar su
trabajo
• Existen múltiples tipos de herramientas, algunas
focalizadas en un servicio concreto y otras que
integran varios de ellos
• Las puedes instalar tu mismo en un servidor o usar
“Software as a Service”
77. Herramientas de gestión de Proyectos
• Servicios
Gestión de proyectos:Tareas,
documentación, comunicación, …
Aspectos técnicos: Análisis de código,
ejecución de test, entornos de
preproducción, …
http://en.wikipedia.org/wiki/Comparison_of_project_management_software
78. Herramientas de gestión de Proyectos
• Gestión de tareas
Sirven para gestionar “las cosas que hay que hacer”
(Issues)
Tipos:
Bugs (que arreglar)
Funcionalidades (que implementar)
Tareas (instalar un servidor)
Campos:Título, responsable, estado (nueva, en
progreso, etc…)
81. Herramientas de gestión de Proyectos
• Documentación compartida
MediaWiki, Google Drive, Confluence
Edición colaborativa (todos participan)
Edición web (en cualquier momento)
Versionado (para que no haya miedo en meter la
pata)
82. Forjas
• Las forjas son servicios más o menos
integrados que ayudan en el proceso de
desarrollo
• Cada forja concreta dispone de más o menos
servicios
http://en.wikipedia.org/wiki/Comparison_of_open_source_software_hosting_facilities
87. GitHub
• Software as a Service
• Public (free) and private (paid) projects
• Wiki
• Tickets
• Release publication
• Web page
• Git repository
• Social network for developers
89. GitHub - Issues
• Los issues sirven para gestionar las tareas, o los
errores (que resolver) o las funcionalidades
(que implementar)
• Algunos sistemas permiten crear “tipos” de
issues para categorizarlos
• Vamos a crear un issue
• Nos pondremos como responsables
90.
91.
92.
93. GitHub - Issues
• Abre el proyecto de un compañero y pon un
comentario en el nuevo issue
• Se le enviará un mail cuando alguien comente
en un issue que tiene asignado
• Pon un comentario en respuesta al comentario
del compañero y cierra el issue
94.
95. GitHub - Issues
• Se pueden asignar etiquetas a los issues para
categorizalos
• Los “tipos de etiquetas” se crean en la página
principal
• Vamos a crear dos tipos de etiquetas:
Roja: Para interfaz de usuario
Negra: Para servicios de backend
• Creamos un issue y le asignamos alguna etiqueta
96.
97. GitHub - Issues
• Se pueden asignar issues a “milestones”
Los milestones son puntos en el desarrollo
Se puede asociar un milestone a cada iteración en la
metodología de desarrollo
• Vamos a crear un milestone
Nombre: Sprint 1
Descripción y fecha: Cómo quieras
Asignar los issues anteriores a este milestone
98.
99.
100.
101. GitHub -Wiki
• GitHub permite editar wikis desde la web
• Además, los ficheros de código fuente en
formato wiki se visualizan como documentos
en la web
• Si el fichero se llama README.md y está en la
raíz del proyecto, se usa como descripción del
mismo
106. GitHub - Eclipse
• Eclipse tiene varios plugins para mejorar la
integración con varias forjas
• GitHub tiene algunos plugins específicos
107. GitHub - Eclipse
• Mylyn
Plugin para gestionar
tareas en Eclipse
Editor de issues
Interfaz centrado en
tareas
108. GitHub - Eclipse
• GitHub Mylyn
Connector
Es necesario instalar
un plugin al plugin
para conectarse a
GitHub
109.
110. GitHub - Eclipse
• Interfaz
basado en
tareas
En IDE sabe en
qué tarea estás
trabajando, y
cuando haces
commit, te
pone el enlace
a la tarea (para
que puedas
consultar info)
111. GitHub - Eclipse
• Eclipse tiene un
plugin para editar
documentos en
formato wiki
• El plugin se llama
“Github flavored
Markdown
viewer”