Git avanzado - Mario González, formador y desarrollador web · 2019-10-01 · git fetch + git...

Preview:

Citation preview

Git avanzadoGit avanzado

TemarioTemarioConceptos inicialesInstalación y configuraciónFundamentos y arquitectura interna de GitCommitsConflictosBranchingRepositorios remotosInterfaces gráficasSubmódulosPull Requests

Git avanzado

Conceptos inicialesConceptos iniciales

Git avanzado

Git avanzado

Conceptos iniciales

Qué es el control de versionesVCS centralizados / distribuidosCLI vs GUIBranching

Git avanzado

Instalación yInstalación yconfiguraciónconfiguración

Git avanzado

Instalación 

Notepad++

Marcar o asegurarse de que está marcado:Git Bash HereUse Notepad++ as Git's default editorUse Git from the Windows Command PromptCheckout Windows-style, commit Unix-style etc.Use MinTTYEnable Git Credential Manager

Crear una cuenta en  (con un email real)

Git

Bitbucket

Git avanzado

Instalación 

Notepad++

Marcar o asegurarse de que está marcado:Git Bash HereUse Notepad++ as Git's default editorUse Git from the Windows Command PromptCheckout Windows-style, commit Unix-style etc.Use MinTTYEnable Git Credential Manager

Crear una cuenta en  (con un email real)

Git

Bitbucket

Git avanzado

Instalación 

Notepad++

Marcar o asegurarse de que está marcado:Git Bash HereUse Notepad++ as Git's default editorUse Git from the Windows Command PromptCheckout Windows-style, commit Unix-style etc.Use MinTTYEnable Git Credential Manager

Crear una cuenta en  (con un email real)

Git

Bitbucket

Git avanzado

Instalación 

Notepad++

Marcar o asegurarse de que está marcado:Git Bash HereUse Notepad++ as Git's default editorUse Git from the Windows Command PromptCheckout Windows-style, commit Unix-style etc.Use MinTTYEnable Git Credential Manager

Crear una cuenta en  (con un email real)

Git

Bitbucket

Git avanzado

Instalación 

Notepad++

Marcar o asegurarse de que está marcado:Git Bash HereUse Notepad++ as Git's default editorUse Git from the Windows Command PromptCheckout Windows-style, commit Unix-style etc.Use MinTTYEnable Git Credential Manager

Crear una cuenta en  (con un email real)

Git

Bitbucket

Git avanzado

Instalación 

Notepad++

Marcar o asegurarse de que está marcado:Git Bash HereUse Notepad++ as Git's default editorUse Git from the Windows Command PromptCheckout Windows-style, commit Unix-style etc.Use MinTTYEnable Git Credential Manager

Crear una cuenta en  (con un email real)

Git

Bitbucket

Git avanzado

Instalación 

Notepad++

Marcar o asegurarse de que está marcado:Git Bash HereUse Notepad++ as Git's default editorUse Git from the Windows Command PromptCheckout Windows-style, commit Unix-style etc.Use MinTTYEnable Git Credential Manager

Crear una cuenta en  (con un email real)

Git

Bitbucket

Git avanzado

Configuración

Variables de configuraciónSistema (S.O.): git config --systemGlobal (usuario): git config --globalLocal (proyecto): git config [--local]

Guardar una variable de configuración:git config [tipo] nombre_variable valorPor ejemplo: git config --system user.name "Mario González"

Leer una variable de configuración:git config [tipo] nombre_variablePor ejemplo: git config --global user.name

Listar todas las variables de configuracióngit config [tipo] --list

Archivos de configuracióngit config [tipo] --list --show-origin

Git avanzado

Configuración inicial

Configuración proxy: git config --global http.proxy http://username:password@host:port git config --global https.proxy http://username:password@host:port

Configuración usuario: git config --global user.name "Mario González" git config --global user.email mario@mariogl.com

Git avanzado

Fundamentos de GitFundamentos de Git

Git avanzado

Fundamentos de Git

Snapshots (commits)RepositorioWorking directoryStage

Git avanzado

Fundamentos de Git

ReferenciasRamasHEADTags

.gitignore ( )Añadir tag: git tag nombre_tag

generador

Git avanzado

CommitsCommits

Git avanzado

Preparando el commitAñadir nuevos archivos al índice (empezar a versionar): git add pathQuitar del índice (desversionar): git rm --cached pathAñadir modificaciones al staging area: git add pathVer las tres zonas: git statusQuitar modificaciones del staging area: git reset HEAD pathDeshacer cambios del Working Directory: git checkout -- pathBorrar archivos: git rm path

Git avanzado

Preparando el commitHacer el commit: git commit [-m "Mensaje"]Evitar mensajes genéricos como "Cambios", "Nuevoarchivo", "Correcciones", "CSS", "Merge"...Modificar el último commit: git commit --amendNo hacer --amend si el commit ya se había subido alremoto

Git avanzado

Preparando el commit

Simulación Working Directory -> Stage -> RepositorioSimulación commits y referenciasSimulación detached HEAD

Git avanzado

El commit

Hash SHA-1Autor / commiteadorFechaMensajePadre/s

Git avanzado

El log

git log [rama] para ver el histórico de commitsgit log --branches para ver el log de todas las ramasReferencias en el logVer el log compacto con git log --onelineVer bifurcaciones con git log --graphVer un commit con git show

Git avanzado

El log

Cómo referenciar a un commitPor su nombre: hash SHA-1Por su posición respecto al HEAD: HEAD^, HEAD^2... HEAD~, HEAD~2...Por su posición en el listado de reflog: HEAD@{n}

Git avanzado

El log

Saltar a otro commit o rama con git checkoutBorrar commits con git resetVer el histórico de HEADs con git reflogCulpar con git blame pathApartar cambios provisionalmente con git stash

git stash [push -m "Mensaje"]git stash listgit stash show stash@{n} -vgit stash apply [stash@{n}]git stash pop [stash@{n}]git stash drop [stash@{n}]

Git avanzado

ConflictosConflictos

Git avanzado

Cuando hay dos versiones de código y Git no puededecidir cuál es la definitivaDiferencias en formato del archivo (tabulaciones,codificación, saltos de línea...)Pueden aparecer en cualquier operación que impliquefusión de código: merge, rebase, cherry-pick, pullSiempre que aparezcan conflictos, primero lanzar gitstatusGit espera a que resolvamos los conflictos y le demos laorden de cerrar la operaciónLos conflictos se delimitan por marcas en los archivos

Conflictos

Git avanzado

Cuando hay dos versiones de código y Git no puededecidir cuál es la definitivaDiferencias en formato del archivo (tabulaciones,codificación, saltos de línea...)Pueden aparecer en cualquier operación que impliquefusión de código: merge, rebase, cherry-pick, pullSiempre que aparezcan conflictos, primero lanzar gitstatusGit espera a que resolvamos los conflictos y le demos laorden de cerrar la operaciónLos conflictos se delimitan por marcas en los archivos

Conflictos

Git avanzado

<<<<<<< HEAD ↑ // Código del commit o rama // adonde apunta el HEAD ↓ ======= ↑ // Código del commit o rama // que estoy intentando fusionar con HEAD ↓ >>>>>>> develop

Conflictos

Git avanzado

Conflictos

Git avanzado

Conflictos

Git avanzado

Conflictos

Git avanzado

Conflictos

Git avanzado

Conflictos

Git avanzado

Si queremos resolverlos a mano, editamos el texto,borramos las marcas y dejamos el código definitivo.Para usar una interfaz gráfica específica para resolverconflictos: git mergetoolEjemplo: configurar KDiff3 git config --global merge.tool kdiff3 git config --global mergetool.kdiff3.path "C:/ProgramFiles/KDiff3/kdiff3.exe"

Conflictos

Git avanzado

Si queremos resolverlos a mano, editamos el texto,borramos las marcas y dejamos el código definitivo.Para usar una interfaz gráfica específica para resolverconflictos: git mergetoolEjemplo: configurar KDiff3 git config --global merge.tool kdiff3 git config --global mergetool.kdiff3.path "C:/ProgramFiles/KDiff3/kdiff3.exe"

Conflictos

Git avanzado

Una vez resueltos los conflictos, se lo comunicamos a gitmediante git add pathPara terminar la fusión en un merge o en un pull: git commitPara terminar la fusión en un rebase: git rebase --continuePara terminar la fusión en un cherry-pick: git cherry-pick --continue

Conflictos

Git avanzado

BranchingBranching

Git avanzado

Ramas

Git avanzado

Ramas

ReferenciaLa rama masterListar ramasCrear una rama con git branchIr a una rama con git checkoutCrear rama e ir a ella con git checkout -bBorrar una rama con git branch -dRenombrar una rama con git branch -m

Git avanzado

Ramas - merge

Git avanzado

Fusionar ramasVolcar el trabajo de una rama en otraObjetivo: que una rama tenga los commits de otraFast forward: no crea un nuevo commitMerge a tres bandas: crea un nuevo commitConflictos: lanzar siempre git statusSimulación

Ramas - merge

Git avanzado

Ramas - rebase

Git avanzado

Ramas - rebase

Aplicar una rama al final de otraVolcar el trabajo de una rama en otraObjetivo: que una rama tenga los commits de otraNo crea un nuevo commitConflictos por pasos: lanzar siempre git statusNo hacer rebase si ya se ha subido la rama al remotoSimulación

Git avanzado

Ramas - cherry-pick

Aplicar un commit aislado a una ramaNo se aplican los commits anterioresModificador -x para que añada al mensaje "Cherry-picked from XXXX"Conflictos: lanzar siempre git status

Git avanzado

Ramas - mover referencias

git branch -f nombre_rama [commit]git reset commit --hardSi sólo queremos avanzar la referencia de una ramahasta un commit más avanzado: git mergerama_destino

Git avanzado

El modelo git flow

master branchdevelop branchfeature branch

bugfix branchhotfix branchrelease branch

Git avanzado

El modelo git flow

master branchdevelop branchfeature branch

bugfix branchhotfix branchrelease branch

Git avanzado

El programa git flow

 (en Windows ya viene instalado conGit)Empezar a usar git flow en un repositorio: git flow initIniciar rama: git flow tipo_rama start nombre_ramaCerrar rama: git flow finish

Instalación

Git avanzado

RepositoriosRepositoriosremotosremotos

Git avanzado

Servidores GIT - repositorios remotos

/ Team Foundation Server

GitHubBitbucketGitLabAzure DevOps

Git avanzado

Repositorios remotos

Clonar un repositorio remoto: git clone URL [directorio]Los remotes: el remote originAñadir un remote con git remote addRenombrar un remote con git remote renameBorrar un remote con git remote removeCambiar la URL de un remote con git remote set-urlTracking branch git branch --set-upstream-to nombre_remote/nombre_ramaVer ramas trackeadas: git remote show nombre_remote

Git avanzado

Repositorios remotos

Enviar cambios al repositorio remoto: git push nombre_remote nombre_ramaTrackear la rama al hacer el push: git push -u nombre_remote nombre_ramaSincronizar mi copia local del remoto con git fetchTraer cambios del remoto con git mergeTraer cambios del remoto con git rebasegit fetch + git merge = git pullgit fetch + git rebase = git pull --rebaseSubir tags: git push --tags

Git avanzado

Repositorios remotos

Borrar ramas del remotoMarcar ramas remotas borradas con git fetch --pruneConfigurar prune por defecto: git config [--global] fetch.prune trueVer lo que voy a enviar en el push: git diff origin/master master

Git avanzado

Interfaces gráficasInterfaces gráficas

Git avanzado

GUI para Git

Git GUI y gitk (instaladas con Git)

Git avanzado

GUI para Git

Git GUI y gitk (instaladas con Git)

Git avanzado

GUI para Git

TortoiseGit

Git avanzado

GUI para Git

SourceTree

Git avanzado

GUI para Git

GitKraken

Git avanzado

GUI para Git

Plugin para EclipseEGit

Git avanzado

GUI para Git

Team Explorer de Visual Studio

Git avanzado

SubmódulosSubmódulos

Git avanzado

Submódulos

Para cuando hay jerarquía de proyectos/módulos

Git avanzado

Submódulos

Añadir un submódulo al módulo padre:git submodule add URL

Clonar un módulo padre con sus submódulos:Método 1: git clone URL --recurse-submodulesMétodo 2: git clone URL git submodule init git submodule update

Git avanzado

Actualizar submódulos a la última versión:git submodule update --remote

Pull RequestsPull Requests

Git avanzado

Pull Requests

En equipos grandesEl repositorio remoto tiene permisos de sólo lecturaen la rama developLos miembros no pueden mergear sus ramas adevelopSe sube la rama propia de feature y se solicita elmerge a través de la interfaz del servidorHay un encargado (o varios) de revisar las peticionesde PR, y de realizar el merge de las ramas a develop

Git avanzado

Pull Requests

En equipos grandesEl repositorio remoto tiene permisos de sólo lecturaen la rama developLos miembros no pueden mergear sus ramas adevelopSe sube la rama propia de feature y se solicita elmerge a través de la interfaz del servidorHay un encargado (o varios) de revisar las peticionesde PR, y de realizar el merge de las ramas a develop

Git avanzado

Links

Documentación oficial de GitLibro Pro GitGenerador de .gitignoreArtículo sobre Git FlowExplicación de git resetSubGitCapítulo de Pro Git sobre submódulosCómo encontrar cosas en GitPosts sobre Git en el blog

Git avanzado

mario@mariogl.com

@marioglweb

Git avanzado

Recommended