Gustavo Morales
Centralizado
Distribuido
Sistema centralizado vs distribuido
http://thepilcrow.net/explaining-basic-concepts-git-and-github/
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
History
Stage area
Working directory
add
commit
checkout
reset
clean
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>
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
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
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
mkdir images
git status
(Descargar una imagen y guardarla en el directorio images)
git status
git add .
git commit -m "Add image"
git status
¿Como agrego un folder vacio en los cambios del commit?
touch [foldername]/.gitkeep
git log
git log --oneline
¿Como puedo ver el contenido de un commit?
git show [hash]
¿Como puedo ver las diferencia entre los cambios que he realizado y los que tengo en stage area?
git diff git diff --staged
¿Como puedo ver las diferencia entre dos commits?
git diff [hash1]..[hash2]
¿Como cambio el mensaje del último commit?
git commit --amend
¿Que pasa si se me olvido incluir un archivo en el último commit?
git add [filepath]
git commit --amend
¿Como puedo añadir solo una lineas de un archivo al commit?
git add -p
git remote add origin [url]
git push -u origin master
Es recomendable revisar que la rama se encuentre AL DIA antes de enviar los cambios
git checkout master git tag [name] git push origin master --tags
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
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
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
¿Como puedo ver el listado de ramas locales o remotas?
git branch
git branch --remote
¿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
¿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
¿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]
¿Como puedo ver la diferencia entre dos ramas?
git diff [branch1]..[branch2]
¿Como puedo borrar una rama local?
git branch -d [name]
git branch -D [name] (force)
¿Como puedo borrar una rama remota?
git push origin [branch] --delete
¿Como puedo traer una rama remota que no tengo en local?
git fetch origin [branch] git checkout [branch]
¿Como puedo traer todas las referencias remotas incluyendo las ramas remotas?
git fetch --all git checkout [branch]
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).
Cuando las ramas son lineales se aplica un merge fast forward
Cuando las ramas divergen el merge crea un nuevo commit con las dos referencias como padres
El rebase pone al día a la rama feature, así se tienen todos los cambios antes del merge
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
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
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
¿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
¿Como puedo borrar todas las ramas locales que he mezclado?
git branch --merged | xargs git branch -d
git show [hash]
git blame [file]
git log --oneline
git log --oneline --graph
git log [branch1]..[branch2]
Documentación de pretty=format
git log --pretty=format:”%h %s %an”
git log --oneline --all --decorate --graph
Todo el historial de movimientos del git
git reflog
¿Cómo se recupera una rama "borrada?
git branch [name] [hash]
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
Una vez se han resuelto los conflictos se puede continuar con:
git rebase --continue
Si se desea abortar el rebease
git rebase --abort
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
¿Como puedo revertir el cambio de un commit?
git revert [hash]
¿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]
¿Como puedo borrar el ultimo o N últimos commits?
git reset --hard HEAD~1
git reset --hard HEAD~[N]
¿Como puedo tomar un commit de otra "lugar"?
git cherry-pick [hash]