Tomas Delvechio
tdelvechio@unlu.edu.ar
@tdelvechio
UNLu - 2015
(Como usar git sin tener que recurrir
a Stackoverflow a cada paso)
Este curso es una adaptación del contenido del Libro Pro Git Versión 2 en español
Pagina Oficial: https://git-scm.com/
Libro Oficial: Pro Git (Versión en Español)
Plataformas de colaboración:
VCS Distribuido
Creado en 2005
Flujos de Trabajo dinámicos
Equipos de trabajos de cualquier tamaño
Backup de código
Tracking de cambios
Colaboración
CLI -> git (A usar en el taller)
Interfaces
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 14.04.2 LTS
Release: 14.04
Codename: trusty
$ sudo apt-get install git
...
$ git --version
git version 1.9.1
3 niveles de configuración
Sistema /etc/gitconfig
Global ~/.gitconfig
Local <path_proyecto>/.git/config
# Nombre del desarrollador
$ git config --global user.name "Antonio Fargas"
# Correo de contacto del desarrollador
$ git config --global user.email huggy@bear.com
# Editor de commits
$ git config --global core.editor nano
# Proxy config
$ git config --global http.proxy http://proxy.unlu.edu.ar:8080
$ git config --global https.proxy https://proxy.unlu.edu.ar:8080
# Ver configuraciones
$ git config --list
# Ver valor de un parametro particular
$ git config user.name
# Ayuda sobre un comando
$ git help config
# o
$ git config --help
# Ver el manual
$ man git-config
# Ayuda para cualquier comando
$ git help <lo_que_sea>
# Manual para cualquier comando
$ man git-<lo_que_sea>
Casos de uso diferentes
Si hay código sin versionar y se desea comenzar a versionarlo, se usa init
Si se quiere comenzar a trabajar en un repositorio git existente, se usa clone
Buscar un proyecto sin versionar
Iniciar un repositorio
Primeros commits
# Moverse al proyecto
$ cd <proyecto_sin_versionar>
# Iniciar el repositorio
$ git init
# Añadir los archivos al nuevo repo
$ git add *
# Commit inicial
$ git commit -m 'Iniciando nuevo repo'
$ git clone https://github.com/SIU-Toba/docker-toba docker-toba-local
$ cd docker-toba-local
Archivos: Tracked y untracked
# Moverse al proyecto
$ cd <proyecto-git>
# Crear un nuevo archivo
$ echo "Licencia de USO" > LICENSE
# Estado del nuevo archivo: Untracked
$ git status
# Untracked -> tracked y staged
$ git add LICENSE
$ git status
# Staged -> Commited
$ git commit -m 'Agregado nuevo archivo'
$ git status
# Modificar el archivo
$ echo "Agregar contenido" >> LICENSE
# Estado: Tracked (Modified)
$ git status
# Modified -> Staged
$ git add LICENSE
$ git status
# Se vuelve a modificar el archivo
$ echo "mas contenido agregado" >> LICENSE
# Estados: Modified y Staged (?)
$ git status
<proyect_path>
|-> README
|-> code.c
|-> .git/
|-> tmp/
|-> .gitignore
Ejemplo de archivo .gitignore:
*.so *.[oa]
*~ tmp/
*.pdf *.bkp
!*.c build/
https://github.com/github/gitignore
# Sin cambios -> Modified
$ echo "Algunos cambios" >> README
$ git status
# Modified -> Staged
$ git add README
$ git status
# Modified and Staged
$ echo "Otros cambios mas" >> README
$ git status
# Ver cambios
$ git diff # Solo modified
$ git diff --staged # Solo staged
$ git diff --cached # Sinónimo de staged
# Commits con mensajes largos
$ git commit
# Commits con mensajes cortos
$ git commit -m 'Cierro issue #113'
# Commits vacíos (ERROR)
# Mas detalle (status + diff)
$ git commit -v
# Ahorrarse el Add
$ echo "Cambio nuevo" >> README
$ git commit -a -m 'Commit de cosas sin add'
# Salida generica
$ git commit -m 'Agregos diversos cambios'
[master 721d54f] Agregos diversos cambios
2 files changed, 3 insertions(+), 1 deletion(-)
create mode 100644 UnArchivoMas.txt
Elementos:
# Borrar el archivo del filesystem
$ rm LICENSE
$ git status
On branch master
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
deleted: LICENSE
no changes added to commit (use "git add" and/or "git commit -a")
# Revertir cambios no agregados
$ git checkout -- LICENSE
# Borrar archivo del filesystem y del VCS
$ git rm LICENSE
# Archivos no commiteados?
$ echo "Archivo nuevo" > BORRAR.txt
$ git add BORRAR.txt
$ git rm BORRAR.txt # ERROR
$ git rm -f BORRAR.txt
# Mover archivos dentro del repositorio
$ git mv <source_path> <destination_path>
# Ver histórico de operaciones
$ git log
$ git log --graph
# Agrega contenido al commit anterior
$ git commit --amend
# Staging -> modified
$ git reset HEAD some_added_file
# Modified -> unmodified
# En este comando se pierde información
$ git checkout -- archivo_a_deshacer.txt
[nombre]: Una referencia local a un remoto, para no tener que escribir la url en cada operación
[url]: La url del remoto sobre los que se aplican las operaciones
git pull master origin
git fetch origin
git merge master
origin: Un remoto "especial" que es interpretado como el default (Para no tener que escribirlo en el comando)
El comando de clonar lo crea para facilitar el workflow de trabajo
[repository]: Remoto al que se quieren enviar los cambios
[branch]: Branch desde el cual se deben extraer los cambios a ser enviados
# Inspeccion de informacion del remoto
$ git remote show origin
* remote origin
Fetch URL: https://github.com/schacon/ticgit
Push URL: https://github.com/schacon/ticgit
HEAD branch: master
Remote branches:
master tracked
dev-branch tracked
Local branch configured for 'git pull':
master merges with remote master
Local ref configured for 'git push':
master pushes to master (up to date)
# Se puede renombrar un remoto
$ git remote rename colega foxmolder
# Se puede eliminar un remoto
$ git remote rm foxmolder