## Plan
Partimos __dende cero__!
![Keep calm and lets go](img/keepcalm_letgo.jpg)
[Photo: Randy Heinitz](https://www.flickr.com/photos/rheinitz/8578335823/)
## Ferramentas a usar
A __consola__ GNU/Linux é a nosa aliada
![Consola GNU/Linux](img/console_allied.png)
[Photo: pixabay (OpenClipartVectors)](https://pixabay.com/en/linux-tux-administrator-animal-154544/)
Tamén usaremos algunha interfaz gráfica / web...
## Levando a charla
Conceptos ≠ Teoría ⇒ Práctica
![Consola GNU/Linux](img/gohome_teacher.jpg)
[Photo: pixabay (geralt)](https://pixabay.com/en/teacher-antiauthoritarian-teaching-379218/)
Interactúa!
## A necesidade de versionar
Os cambios existen. No dixital son moi habituais.
![Cambios](img/change_cycle.png)
[Photo: pixabay (geralt)](https://pixabay.com/en/change-arrows-transformation-1076219/)
- Marcha atrás nos cambios
- Comparar con cambios anteriores
- Saber quen fixo os cambios
## Socorro! Unha ferramenta
- Version Control System (VCS)
- Software Configuration Management (SCM)
- Source Control Management (SCM, tamén?)
![Colaboración Android e Comunidade](img/android_community.png)
[Photo: Android Documentation](https://source.android.com/source/code-lines.html)
## Evolución dos SCM (libres)
- RCS - Revision Control System (por ficheiro)
- CVS - Concurrent Versions System (multiusuario)
- Subversion (eficiente en rede)
![Logo Subversion](img/subversion_logo.png)
[Photo: Apache Software Fundation](http://subversion.apache.org/)
## E Linus Torvalds plantou Git
![Torvalds lanza Git](img/linux_git.png)
[Photo: SlideShare.net (mikeflynn_)](http://www.slideshare.net://mikeflynn_/git-its-better-trust-me)
- Hoxe é o máis usado, desbancando ao resto.
- Ecosistema de ferramentas.
## Abrimos unha consola?
```
# sistemas Debian:
sudo apt-get install git gitg
# sistemas RPM:
sudo yum install git gitg
```
![Git en consola](img/git_console.png)
## Manual do sistema (_man pages_)
- A fonte directa máis completa para entender cada orde
![Git en consola](img/man_pages.png)
```
git help ORDE_GIT
```
```
man git-ORDE_GIT
```
## StackOverflow
![StackOverflow](img/stackoverflow.png)
http://stackoverflow.com
## Git book
![StackOverflow](img/git_book.png)
https://git-scm.com/book/es/v2
## Chuleta para imprimir
![Git Cheat Sheet](img/git_cheat_sheet.png)
[Google Images "Git Cheatsheet"](http://zrusin.blogspot.nl/2007/09/git-cheat-sheet.html)
## Chuleta interactiva
![Git Cheat Sheet](img/git_cheat_sheet_ndp.png)
[Cheatsheet NDP](http://ndpsoftware.com/git-cheatsheet.html)
- Interactiva!
- Substituto das páxinas 'man'
- Traducida a varias linguas
## Configuración
- Por repositorio
- Global ao usuario (--global)
----
### Nome e email do usuario
```
git config --global user.name 'Nome Apelido'
git config --global user.email 'nomeapelido@correo.sample'
```
### Configuración activa
```
git config --list
```
![GitHub](img/git_config.png)
## Área de traballo
- onde fedellamos cos ficheiros e directorios
- partimos dun directorio __raíz de proxecto__
----
## Repositorio
- historia con todos os __cambios xestionados por git__
- subdirectorio __.git__ na raíz do proxecto (non editar!)
![Área de traballo e repositorio git](img/working_area.png)
## Crear un repositorio
```
git init [DIRECTORIO]
_
```
![Creando un repositorio dende 0](img/git_init.png)
1. Crea un novo directorio no teu disco duro para un novo proxecto e
inicializa o repositorio Git.
2. Crea un ficheiro de texto _README.md_ co título do proxecto dentro.
3. Executa `git add README.md && git commit -m 'BigBang'`
## Copiar (clonar) un repositorio
```
git clone URL_REPO [DIRECTORIO]
_
```
![Clonando un repositorio](img/git_clone.png)
1. Clona no teu disco duro o repositorio que está na URL
**https://github.com/rafacouto/git-minicurso.git**
2. Extra: volve a facer o mesmo pero agora que o directorio sexa **/tmp/slides** e
logo borra o subdirectorio **/tmp/slides/.git**
### Historial de cambios
```
git log --oneline --tags
_
```
![Histórico de cambios](img/git_log.png)
----
- Filtros por data: --since=2016-03-12 --until=2016-03-31
- Outros filtros: --author=caligari --grep="regex"
### Etiquetas
- Etiqueta: __referencia a un commit__ concreto cun nome 'sinxelo'.
![Etiqueta como referencia](img/tag.png)
----
```
git tag v1.1-placidus 17de0f2c
git tag
git checkout v1.1-placidus
git log --decorate
_
```
### Referencia HEAD
- É unha referencia que sempre apunta ao último commit da póla (branch) actual.
![Referencia HEAD](img/head_ref.png)
[Photo: Nulab Inc. (Backlog)](https://backlogtool.com/git-guide/en/stepup/stepup1_3.html)
----
#### Referencias relativas a HEAD
- HEAD^ (un commit antes da actual HEAD)
- HEAD^^ (dous commit antes da actual HEAD)
- HEAD~n ('n' commit antes da actual HEAD)
### Moverse entre versións
```
git checkout
_
```
![Cambiado de versión con checkout](img/git_checkout.png)
[Photo: RyPress.com](http://rypress.com/tutorials/git/tips-and-tricks)
----
1. Clonar o repositorio de firmware do Escornabot
https://github.com/escornabot/arduino.git
2. Ir a versión marcada como _v1.1-placidus_
### Examinar cambios no área de traballo
```
git status
_
```
![Estado do área de traballo](img/git_status.png)
### Creación dun paquete de cambios
```
git commit -m 'MENSAXE DE CAMBIOS'
_
```
![Operaciones locales](img/local_operations.png)
[Photo: Juri Strumpflohner](http://juristr.com/blog/2013/04/git-explained/)
### Preparando o commit
```
git add FILES
git rm FILES
git mv SRC DST
_
```
![File lifecycle](img/file_status_lifecycle.png)
[Photo: oxkhar (slides)](http://slides.oxkhar.com/git/#/)
```
git diff
_
```
### GitHub - O git na web e moito máis
![GitHub](img/github_logo.png)
- Crear unha __conta Github__
- Receitas para __crear un repositorio__ en Github
- Ficheiros README.md (formato de texto __markdown__)