1. Perder el miedo a Git en 90 minutos
´
Adeodato Simo
Zaragoza, 2009-02-20
Perder el miedo a Git en 90 minutos
2. Plan para esta hora y media
• La revolucion de los SCM distribuidos: verdades y mentiras
´
• SCM distribuidos: cosas a tener en cuenta
• Por que Git: caracter´sticas interesantes
´ ı
• Pilares basicos de Git
´
• Tour por los comandos mas interesantes
´
• Preguntas
Perder el miedo a Git en 90 minutos
3. ´
La revolucion de los SCM distribuidos
• La gran mentira: La mayor ventaja de los SCM distribuidos es
que tienes una copia local de la historia, y puedes hacer log y diff
sin estar conectado.
• Lo anterior es una caracter´stica conveniente, pero los
ı
verdaderos beneficios de los SCM distribuidos son:
• Democratizacion de las herramientas
´
• Derecho a la intimidad y la higiene
Perder el miedo a Git en 90 minutos
4. ´
La democratizacion de los SCM
La metedura de pata de los SCM centralizados: hacer del nivel de
acceso un discriminador clasista a nivel de herramienta
´ ´
La pregunta del millon: ¿por que mis contribuidores no pueden utilizar
las mismas herramientas que yo, y para que puedan
hacerlo, han de tener mi mismo nivel de acceso?
´
Caso ideal: tener acceso es un marron, y no una ventaja. (Tattoo
that.)
Perder el miedo a Git en 90 minutos
5. Nuevo orden de cosas
• Los SCM distribuidos permiten a cualquier persona desarrollar
en igualdad de condiciones
• El como y cuando dar acceso es ahora una cuestion social o
´ ´ ´
´
pol´tica, como siempre debio ser
ı
• Para los escepticos que digan: ¿realmente hay tanta diferencia
´
entre ”svn commit” y ”svn diff — mutt”?
• Quiza no con Subversion, pero en los SCM distribuidos (y en
´
particular con Git) la diferencia se hace abismal
Perder el miedo a Git en 90 minutos
6. El derecho a la intimidad y la higiene
• En los SCM centralizados:
• crear ramas ”impone”, pues todas han de ir al repositorio central,
´ ´
y seran visibles incluso si son abandonadas despues
• no hay Ctrl-Z
• Los SCM distribuidos:
• permiten el desarrollo en privado
• hay Ctrl-Z ilimitado en la copia local
Perder el miedo a Git en 90 minutos
7. Particularidades de los SCM distribuidos
• Indivisibilidad del arbol
´
• no hay checkouts parciales como en SVN
• hace falta cirug´a y magia para dividir un repositorio en dos (y eso
ı
cuando es posible)
• pero se pueden ”arrejuntar” repositorios
• Indivisibilidad de la historia
• se copia siempre toda la historia del proyecto a la maquina local
´
• existe funcionalidad para obtener solo una parte, pero el resultado
´
tiene limitaciones
Perder el miedo a Git en 90 minutos
8. ´
¿Por que Git?
• Anecdota: mi historia y lo que le´ en un blog
´ ı
• Ventajas:
• riqueza
• flexibilidad
• velocidad
• eficiencia espacial
• ´
nivel de adopcion
• Sobre la curva de aprendizaje...
• no es tanto la complejidad de la herramienta
• como, en muchos aspectos, el cambio de paradigma
Perder el miedo a Git en 90 minutos
9. Git: algunas caracter´sticas
ı
• Disenado a lo Unix
˜
• un ejecutable distinto para cada tarea
• estos se combinan entre s´ facilmente
´ ı´
• muchos no se usan normalmente (”plumbing”)
• Sin miedo a romper paradigmas
• el ”index”
• ´
la cirug´a como accion cotidiana
ı
• una manera diferente de renombrar ficheros
• ´
$PAGER por omision
• Posibilidad de ignorar la magia y utilizarlo como un SCM ordinario
Perder el miedo a Git en 90 minutos
10. Modelo de datos interno
• Etiquetador ⇒ Tag
• Flechas ⇒ Branches (flecha roja: HEAD)
• Grafo ⇒ Commits
• meta-informacion (incl. padre/s)
´
• tree
• blob
• tree
• Concepto de ”committish” y ”treeish”
• La copia de trabajo y su relacion con la rama
´
Perder el miedo a Git en 90 minutos
11. ´
Como referirse a los ”committish”
• Formas basicas:
´
• SHA1: 9448a825ddb13c79a35e438c6d9d6bd485b66b52
• SHA1 abreviada: 9448a8
• nombres simbolicos (ramas y tags): HEAD, master, 0.9.2
´
• Refiriendose a los padres:
´
• HEADˆ (el padre inmediato)
• HEAD 1 (´dem)
ı
• HEAD 2 (el padre del padre, etc.)
• Funcionalidad extra: HEAD@two weeks ago
Perder el miedo a Git en 90 minutos
12. El index (I): commit en los SCM tradicionales
• En una copia de trabajo en un SCM tradicional se diferencia
entre:
• (a) ficheros que el SCM conoce (via ‘svn add‘)
• (b) ficheros que el SCM sabe que ha de ignorar
• (c) ficheros de los que no sabe nada (limbo)
• La operacion ”commit” automaticamente detecta cambios en los
´ ´
´
ficheros (a), y crea una nueva revision con ellos:
‘svn commit‘ <--> (a)
(b) |-> ignorados por ’’commit’’
(c) |/
Perder el miedo a Git en 90 minutos
13. El index (II): todo es limbo en Git
• En Git, la operacion commit”no se interesa por el estado de los
´¸
ficheros en (a):
• a efectos de commit”, todos los ficheros estan en el estado (c), en
´
¸
el limbo
• (otras operaciones como status y diff s´ pueden diferenciar entre
ı
los tres estados)
• git commit decide que incluir en la revision mirando en un lugar
´ ´
especial... el index
Git <--> Staging area <--> Limbo
------------ -----
Index Working dir
Perder el miedo a Git en 90 minutos
14. ˜
El index (III): anadiendo cosas al index
• Con ‘git add‘, todos los cambios a un fichero pasan al index:
% edit foo.c
% git add foo.c
% git commit -m ’Arreglado no s´ qu´ en foo.c’
e e
• Cuidado:
% edit foo.c (#1)
% git add foo.c
% edit foo.c (#2)
% git commit -m ’Cambios de #1 pero no de #2’
Perder el miedo a Git en 90 minutos
15. ´
El index (IV): interaccion ‘diff‘ y ‘status‘
• ‘git diff‘ a secas muestra las diferencias entre la copia de trabajo
y el ´ndice:
ı
% edit foo.c
% git add foo.c
% git diff foo.c
=> Diff vac´o!
ı
• Optiones interesantes:
% git diff --cached # HEAD <--> index
% git diff HEAD # HEAD <--> working dir
• Los tres estados de ‘git status‘
Perder el miedo a Git en 90 minutos
16. El index (y V): consejos y trucos finales
• Elegir que cambios anadir hunk a hunk:
´ ˜
% git add -p [fichero]
• Usos del index:
• revisar codigo, de otros o de uno mismo (anadir al index lo ”ya
´ ˜
revisado”)
• Fingir que el index no existe:
% git commit -a
% git diff HEAD
Perder el miedo a Git en 90 minutos
17. Trabajar con ramas
• Publicidad enganosa en SVN: ”Branching is O(1)”
˜
• Branchear en la justa medidai
• Comandos:
• git branch nueva rama
• git checkout otra rama
• ´
(¿que pasa con los non-committed cambios?)
• git checkout -b nueva rama2
• ‘git merge‘: merges vs ”fast forwards”
Perder el miedo a Git en 90 minutos
18. Repositorios locales y remotos
• Copia inicial (git clone):
• las ramas remotas se copian a ”origin/¡rama¿”
• se crea una rama local (normalmente ”master”)
• Actualizaciones sucesivas (git pull):
• se reciben los datos, y se actualizan la ”tracking branches”,
incluyendo la actual
• Enviar (git push):
• mapeo rama local <--> remota, y se actualizan
• $PATH/repo/.git vs $PATH/repo.git
Perder el miedo a Git en 90 minutos
19. La cirug´a privada, piedra angular de este SCM
ı
• Tambien denominada ”history rewriting”, pero no me gusta ese
´
nombre...
• ¿Por que privada/en privado?
´
• Consecuencias de la cirug´a
ı
• Cosas que se pueden hacer:
• Cambiar cualquier commit
• ´
Unir dos o mas commits en uno
• O dividir un commit en varios
• Transplantar una serie de commits a otra rama
Perder el miedo a Git en 90 minutos
20. Integridad en Git y secuelas de la cirug´a
ı
• Para dar nombres a las cosas, Git usa SHA1:
• los objetos internos no tienen otro nombre que el SHA1 de su
contenido
• Es imposible cambiar algo en el repositorio y no cambiarle el
nombre: git se quejar´a mucho
ı
• posibilita detectar corrupcion de disco
´
• si tienes un tag firmado, toda la historia que conduce a ese tag
queda verificada
• La cirug´a renombra todas las cosas que toca, y toda la
ı
descendencia de esas cosas
Perder el miedo a Git en 90 minutos
21. Herramientas para la cirug´a
ı
• Editar el ultimo commit: git commit –amend
´
• Editar commits ”enterrados”, unir o dividir commits: git rebase -i
• Transplantar historia: git rebase, git pull –rebase
• Desechar commits: git reset, que viene en tres sabores:
• –soft
• –mixed
• –hard (cuidado!)
• y dos modelos (con y sin argumentos)
Perder el miedo a Git en 90 minutos
22. git reset (cont.)
• Sin argumentos, pone el estado al ultimo commit:
´
´
% git reset => resetea el ındice
% git reset --hard => desechar todos los
cambios locales
• Con argumentos, pone el estado al commit especificado:
• Para solo ”resetear” un fichero...
´
• git checkout FILE (muy intuitivo...)
Perder el miedo a Git en 90 minutos
23. Descubriendo git log
• Cosas basicas:
´
% git log --name-status
% git log -p
• El motor de busqueda:
´
% git log --author=’John Doe’
% git log --grep=’playlist’
% git log -S’nombre_de_una_funcion’
Perder el miedo a Git en 90 minutos
25. Escribir commit messages
| Incluir una l´nea de sumario, corta y
ı
|
| Luego una l´nea en blanco, y el resto de la
ı
| descripci´n, en tantos p´rrafos como haga
o a
| falta.
• ¿Por que as´? ¿Es obligatorio?
´ı
Perder el miedo a Git en 90 minutos