git avanzado - mario gonzález, formador y desarrollador web · 2019-10-01 · git fetch + git...
Embed Size (px)
TRANSCRIPT

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 [email protected]
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
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