
Trabajando con git
Gustavo Morales
Contenido
- Acerca de git
- ¿Cómo funciona?
- Configuración
- Trabajando localmente
- Publicando cambios
- Utilizando las ramas
- Mezclando el trabajo
- Revisando los cambios
- Resolviendo los conflictos
Acerca de git
git
- Version Control System
- Open Source y de libre uso.
- Multiplataforma
- Página oficial: https://git-scm.com
- Documentación: https://git-scm.com/docs
- Libro: https://git-scm.com/book
git


Centralizado
Distribuido
Sistema centralizado vs distribuido
http://thepilcrow.net/explaining-basic-concepts-git-and-github/
git
¿Cómo funciona?
¿Cómo funciona?
Inspeccionamos un repositorio ya creado:
git clone https://github.com/gmoralesc/orangebox
cd orangebox
ls -a
ls -a .git
git log
Cada commit está identificado con hash único en el repositorio
¿Como funciona?
- El directorio .git tiene todo el repositorio
- git solo guarda el historial de cambio en los archivos (deltas) no copias de los mismos
- Inclusive el cambio de nombre de los archivos o cambios en la ubicación
- Todo es posible hacerlo desde la línea de comandos pero existen interfaces visuales
¿Como funciona?
History
Stage area
Working directory
add
commit
checkout
reset
clean
¿Como funciona?
- git status es una visión del estado del repositorio
- Los archivos que ingresar al repositorio (history) son considerados de allí en adelante como: tracked files
- Los archivos nuevos creados en el área de trabajo (working directory) son considerados como: untracked files
- Guia visual:
http://www.ndpsoftware.com/git-cheatsheet.html
Configuración
Configuración
Configuración minima
git config --global user.name "Gustavo Morales" git config --global user.email gustavo.morales@gmail.com git config --global core.editor nano git config --list git config --global -e
Configuración adicional
git config --global core.editor "code --wait"
git config --global merge.tool [merge tool]
git config --global commit.template ~/.[template].txt
Diff
[diff] tool = default-difftool [difftool "default-difftool"] cmd = code --wait --diff $LOCAL $REMOTE
EJemplos
git rebase HEAD~N -i git commit git add -p git difftool <commit>^ <commit>
Configuración
Configuración
- Configuración local (--local): dentro del repositorio
- Global (--global): para todos los repositorios del usuario
- Del sistema (--system): para todos los usuarios
- La configuración se aplica desde el sistema hasta el local mezclando las llaves
github

Trabajando localmente
Trabajando localmente
mkdir myrepo && cd myrepo
git init
git status
touch index.html
(Añadir contenido al index.html)
git status
git add index.html
git commit -m "Add index"
git status
Trabajando localmente
touch about.html
(Añadir contenido al about.html)
git status
(Modificar index.html)
git status
git add .
git commit -m "Add some changes"
git status
Trabajando localmente
Permite añadir los "patterns" de los directorios y/o archivos que serán ignorados:
touch .gitignore node_modules/ .DS_Store Thumbs.db git add .gitignore git commit -m "Add gitignore file"
.gitignore
Trabajando localmente
mkdir images
git status
(Descargar una imagen y guardarla en el directorio images)
git status
git add .
git commit -m "Add image"
git status
Trabajando localmente
¿Como agrego un folder vacio en los cambios del commit?
touch [foldername]/.gitkeep

Trabajando localmente
git log
git log --oneline
Trabajando localmente
¿Como puedo ver el contenido de un commit?
git show [hash]

Trabajando localmente
¿Como puedo ver las diferencia entre los cambios que he realizado y los que tengo en stage area?
git diff git diff --staged

Trabajando localmente
¿Como puedo ver las diferencia entre dos commits?
git diff [hash1]..[hash2]

Trabajando localmente
¿Como cambio el mensaje del último commit?
git commit --amend

Trabajando localmente
¿Que pasa si se me olvido incluir un archivo en el último commit?
git add [filepath]
git commit --amend

Trabajando localmente
¿Como puedo añadir solo una lineas de un archivo al commit?
git add -p

Publicando cambios
Publicando cambios
- Crear un nuevo repositorio en Github
git remote add origin [url]
git push -u origin master
- El remote por defecto es origin
- El branch por defecto es master
Es recomendable revisar que la rama se encuentre AL DIA antes de enviar los cambios

Publicando cambios
- Crear una etiqueta para release
git checkout master git tag [name] git push origin master --tags

Publicando cambios
- Si se editó la rama local es posible sobreescribir el historial de la rama remota:
git push [remote] [branch] -f
Esto es una operación destructiva que no se puede reversar, NO es recomendable utilizar este opción al menos que sea la única opción

Utilizando ramas
Utilizando ramas
Utilizando ramas
- La mejor estrategia para crear o descartar nuevas funcionalidades en el proyecto
- Una de las mejores formas de organizarse para trabajar en equipo
- Se pueden tener cuantas ramas (locales y remotas) se deseen
- La rama no es una copia de los archivos
Utilizando ramas
- Crear una rama a partir del estado de la actual
git checkout -b develop
git branch
Es recomendable revisar en CUAL rama se encuentra antes de empezar a trabajar
Es recomendable revisar el estado de la rama antes de cambiarse a otra rama

Utilizando ramas
touch contact.html
(Agregar contenido a contact.html)
git add contact.html
git commit -m "Add contact page"
git log --oneline
git checkout master
git log --oneline
Utilizando ramas
¿Como puedo ver el listado de ramas locales o remotas?
git branch
git branch --remote

Utilizando ramas
¿Que hacer si tengo WIP en la rama y no quiero hacer el commit?
git checkout develop
(Modificar about.html)
git status
git add about.html
git stash --all
git status
git checkout master
git status
(Aqui verificamos que no hay cambios en el master)

git checkout develop
git stash list
git stash pop
git add about.html
git commit -m "Modify about"
git status
git stash list
Utilizando ramas
¿Que pasa si quiero descartar todos los cambios que he realizado en una rama?

untracked files
git clean -f
tracked file
git checkout .
staged files
git reset
Utilizando ramas
¿Que pasa si quiero descartar el cambio en un solo archivo?
untracked file
git clean -f [path-name]
tracked file
git checkout -- [path-name]
staged file
git reset HEAD [path-name]

Utilizando ramas
¿Como puedo ver la diferencia entre dos ramas?
git diff [branch1]..[branch2]

Utilizando ramas
¿Como puedo borrar una rama local?
git branch -d [name]
git branch -D [name] (force)

Utilizando ramas
¿Como puedo borrar una rama remota?
git push origin [branch] --delete

Utilizando ramas
¿Como puedo traer una rama remota que no tengo en local?
git fetch origin [branch] git checkout [branch]

Utilizando ramas
¿Como puedo traer todas las referencias remotas incluyendo las ramas remotas?
git fetch --all git checkout [branch]

Mezclando el trabajo
Mezclando el trabajo
-
Hay diferentes formas de mezclar el trabajo realizado en una rama a la rama "principal".
-
El comando utilizado es merge
-
Puede ser de manera local o remota.
Es recomendable:
-
El recomendable hacer un rebase de la rama de trabajo antes de publicar.
-
Una vez publicada la rama hacer una petición de merge remoto a traves de Pull Request (PR).
Mezclando el trabajo
Cuando las ramas son lineales se aplica un merge fast forward
Mezclando el trabajo
Cuando las ramas divergen el merge crea un nuevo commit con las dos referencias como padres
Mezclando el trabajo
El rebase pone al día a la rama feature, así se tienen todos los cambios antes del merge
Mezclando trabajo
-
Pull request: Una petición remota de merge desde la rama de feature remota a la rama de trabajo remota.
Permite hacer revisión de pares.
Permite actualizar si se necesitan cambios.
Queda documentando.
Github collaborators
Mezclando trabajo
Verificar que la rama este limpia (git status)
git push origin develop
Ir a Github y crear un Pull Request (PR)
Aprobar el PR y mezclar
git checkout master
git pull origin master
Mezclando trabajo
git checkout master
(Añadir una nueva imagen y hacer el commit)
git checkout develop
(Crear un cambio en el about.html y hacer el commit)
(Ahora la rama develop no esta al día)
git rebase master
Si master no esta actualizada localmente el rebase se puede hacer con la rama remota git pull origin master --rebase
Mezclando trabajo
¿Como puedo ver que ramas se han mezclado y cuales no?
git branch --merged
git branch --no-merged

Las ramas locales deben estar al día para ver os cambios
Mezclando trabajo
¿Como puedo borrar todas las ramas locales que he mezclado?
git branch --merged | xargs git branch -d

Revisando trabajo
Revisando los cambios
git show [hash]
git blame [file]
git log --oneline
git log --oneline --graph
git log [branch1]..[branch2]

Revisando los cambios
Documentación de pretty=format
git log --pretty=format:”%h %s %an”
git log --oneline --all --decorate --graph

Revisando los cambios
Todo el historial de movimientos del git
git reflog

Revisando los cambios
¿Cómo se recupera una rama "borrada?
git branch [name] [hash]

Resolviendo conflictos
Resolviendo conflictos
En la rama master editar el archivo index.html en una linea especifica y hacer el commit
En la rama develop editar el archivo index.html en la misma linea y hacer el commit
git rebase master
Revisar el conflicto y continuar con el rebase o abotar sea el caso
git add index.html
Resolviendo conflictos
Una vez se han resuelto los conflictos se puede continuar con:
git rebase --continue
Si se desea abortar el rebease
git rebase --abort
Resolviendo conflictos
Recomendado utilizar rebase interactivo
git rebase -i master
Inclusive permite reorganizar los commits si NO se han publicado remotos, por ejemplo los 2 últimos commits.
git rebase -i HEAD~2

Resolviendo conflictos

¿Como puedo revertir el cambio de un commit?
git revert [hash]
Resolviendo conflictos
¿Como puedo borrar el ultimo o N últimos commits sin perder los cambios que estos contienen?
git reset --soft HEAD~1
git reset --soft HEAD~[N]

Resolviendo conflictos
¿Como puedo borrar el ultimo o N últimos commits?
git reset --hard HEAD~1
git reset --hard HEAD~[N]

Resolviendo conflictos
¿Como puedo tomar un commit de otra "lugar"?
git cherry-pick [hash]

Git Cheatsheet
Trabajando con git
By Gustavo Morales
Trabajando con git
- 629
