Introducción
a Git
Meetup: Desarrolladores
de Hellín y alrededores
@gruizdevilla
@adesis
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/84648/branching-illustration_2x.png)
$ whoami
$ aboutthis
Gonzalo Ruiz de Villa
@gruizdevilla
Cofundador y trabajador en @adesis
Esta presentación se preparó para el meetup de desarrolladores de Hellin de introducción a Git.
¿Qué necesitas tener preparado?
Instálate Git
http://git-scm.com/
Un cliente fantástico: SourceTree
http://www.sourcetreeapp.com/
Create una cuenta en un servicio online
o si quieres
¿Qué es Git?
Git es un sistema de control de versiones distribuido gratuito y de código abierto diseñado para gestionar todo desde un proyecto pequeño a un proyecto muy grande con rapidez y eficiencia.
Sistema de control de versiones
Registrar los cambios de un fichero o un conjunto de ficheros a lo largo del tiempo con la posibilidad de recuperar alguna versión más tarde.
Sistema de versiones local
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/84651/local.png)
Sistema de control de versiones centralizado
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/84652/centralizado.png)
Sistema de control de versiones descentralizado
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/84653/descentralizado.png)
Ventajas de la descentralización
- Se elimina el punto único de fallo
(el servidor central)
- Cada checkout es una copia completa
del repositorio
- Se puede colaborar simultáneamente
con varios repositorios remotos, distintos
usuarios y distintos equipos
DCVS: Git, Mercurial, Bazaar, Darcs
(el servidor central)
del repositorio
con varios repositorios remotos, distintos
usuarios y distintos equipos
Configura tu entorno
Configuración global
$ git config --global user.name "Bruce Wayne" $ git config --global user.email bruce.wayne@wayneindustries.com
Configuración local de un proyecto, sin --global
$ git config user.name "Batman"
$ git config user.email batman@superheroes.org
Consiguiendo un repositorio
Crealo!
git init
$ touch viaje.txt
windows: echo.>viaje.txt
$ git init
Analicemos lo que aparece
$ tree -a
(tree /f)
$ git add .
$ git commit -m 'primer commit'
Analicemos lo que aparece
$ tree -a
(tree /f)
Clónalo
git clone
$ git clone git://github.com/gonzaloruizdevilla/meetuphellin.git
El flujo de trabajo básico
Editar ficheros
Registrar (stage) los cambios
Revisar los cambios
Aplicar (commit) los cambios
Tres zonas:
- área de trabajo
- área de staging (index)
- repositorio
1. Edita los ficheros
(con tu editor favorito)
nano viaje.txt
edit viaje.txt
...
Revisa que cambios llevas
$ git status
Agrega los cambios al "staging area"
$ git add viaje.txt
Revisa:
$ git status
Hay que "stagear" o registrar los cambios antes de aplicarlos.
$ git commit
Flujo de trabajo habitual
Editar
Stage/almacenar (git add)
Revisar (git status)
Aplicar (git commit)
Acelerando
$ git commit -a
Enviando varios cambios de golpe. Múltiples:
git add
Revisar los cambios individuales
$ git diff
¿Qué está "staged"?
git diff --cached
Revisando la historia
$ git log
$ git log --oneline
Y muchas más opciones de visualización.
Branches y merges
Ramas y fusiones
Listado de ramas
$ git branch
Crear rama
$ git branch experimento
Cambiar de rama
$git checkout experimento
(n veces) $ git commit
Los commits afectan solo a la nueva rama
$ git checkout master
Volvemos a la rama "master" en la posición en la que la dejamos.
(n veces) $ git commit
Las ramas divergen y en algún momento querremos fusionar los desarrollos:
$ git checkout <rama-destino>
$ git merge <rama-origen>
¿Por qué?
Puedes probar cosas nuevas
Aislar unidades de trabajo
Separar líneas de trabajo que duren mucho tiempo
Visualizar las ramas de trabajo
$ git log --online --graph
Stash
Guardando cambios pendientes
$ git stash
Listado de cambios almacenados
$ git stash list
Aplicar cambios
$git stash apply
Más opciones:
save, list, drop, pop, apply, branch
Repositorios remotos
Puedes trabajar con múltiples repositorios remotos.
Crea tu repositorio en GitHub
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90558/Captura_de_pantalla_2013-09-14_a_la_s__08.27.14.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90559/Captura_de_pantalla_2013-09-14_a_la_s__08.27.29.png)
Listamos repositorios
$ git remote
Agregamos la referencia
$ git remote add origin https://github.com/tuusuario/meetuphellin.git
Para subir cambios los empujamos (push) a una rama de un repositorio
$ git push origin master
El "tracking" de un repositorio se activa con el primer push, luego hay que escribir menos:
$ git remote show origin
$ git push
Flujo: fetch, pull, push
Fetch: importa los commits del repositorio remoto (no los aplica)
$ git fetch origin
$ git branch -a
Pull: fetch + merge
$ git pull origin
Muy habitual usar --rebase para conseguir una historia más lineal y evitar merges:
$ git pull --rebase origin
Push: enviar los cambios al repositorio remoto
$ git push origin master
Trabajar en equipo
Hay muchos repositorios remotos:
- el/los repositorio(s) principal(es)
- los repositorios públicos de cada unos de los miembros del equipo
Flujos de trabajo en equipo
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90561/git-workflows-forking.png)
Tagging/Etiquetando
Etiquetado de snapshots
$ git tag v1.0
Tags anotados
(Annotated tags)
$ git tag -a v1.2 -m "la version 1.2"
Compartir tags: subir tags a un repositorio compartido
$ git push --tags
Git Blame
Quién y cuando se modificó cada línea de un fichero
$git blame viaje.txt
Reescribiendo la historia
Reescribiendo el último commit
$ git commit --amend
Rebase
Cambiando la base
$git rebase master
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90355/Captura_de_pantalla_2013-09-13_a_la_s__23.26.56.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90354/Captura_de_pantalla_2013-09-13_a_la_s__23.27.42.png)
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90357/Captura_de_pantalla_2013-09-13_a_la_s__23.28.45.png)
Sourcetree
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90364/logoSourceTree_2x.png)
http://www.sourcetreeapp.com/
GitHub
https://github.com
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90366/github-logo-transparent.png)
Bitbucket
https://bitbucket.org/
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90376/bitbucket1.png)
Ciclo de desarrollo
![](https://s3.amazonaws.com/media-p.slid.es/uploads/gruizdevilla/images/90562/git-workflow-release-cycle-3release.png)
Consejos para buenos commits
Contenido del commit para subir a repositorios centralizados/compartidos
- El commit mejora la funcionalidad
- Contiene tests unitarios
- Contiene la documentación relevante
- Ha sido testado
- Se ha hecho rebase
- Los commits llevan un único cambio lógico/funcional/carácteristica/fix cada úno
- El mensaje es correcto:
Formato del mensaje
del commit:
<tipo>(<ámbito>): <asunto>
<LÍNEA EN BLANCO>
<LÍNEA EN BLANCO>
<cuerpo del mensaje>
<LÍNEA EN BLANCO>
<pie del mensaje>
tipos habituales: feat(feature/nueva característica), fix, doc (documentación), style, refactor, test (si faltaban tests), chore (tareas de mantenimiento)
Title
Referencias
-
http://librosweb.es/pro_git/
- http://charliedontcode.com/programacion/2011/11/27/tutorial-de-git-en-espanol.html
- http://blog.xenodesystems.com/2012/05/tutorial-git-desde-cero.html
- http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=githubFirstStepsUploadProject
- http://www.adictosaltrabajo.com/tutoriales/tutoriales.php?pagina=git-branch-bash
¡Gracias!
¿Preguntas?
Introducción a Git
By Gonzalo Ruiz de Villa
Introducción a Git
Breve introducción a Git. Presentación preparada en el Meetup de Desarrolladores de Hellín
- 41,894