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

git

Centralizado

Distribuido

Sistema centralizado vs distribuido

http://thepilcrow.net/explaining-basic-concepts-git-and-github/

git

Comprobar si está instalado:

 

git --version

 

Descargas: https://git-scm.com/downloads

¿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

Made with Slides.com