git avanzado - mario gonzález · git fetch + git rebase = git pull --rebase si siempre queremos...
TRANSCRIPT
Git avanzadoGit avanzado
Conceptos inicialesConceptos iniciales
Git avanzado
Git avanzado
Conceptos iniciales
Qué es el control de versionesVCS centralizados / distribuidosLínea de comandos vs. interfaces gráficasBranching
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
Git avanzado
Instalació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
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 [ámbito] nombre_variable valorPor ejemplo: git config --system user.name "Mario González"
Leer una variable de configuración:git config [ámbito] nombre_variablePor ejemplo: git config --global user.name
Listar todas las variables de configuracióngit config [ámbito] --list
Archivos de configuracióngit config [ámbito] --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
Configuración Notepad++: git config --global core.editor "'C:\Program Files(x86)\Notepad++\notepad++.exe' -multiInst -notabbar -nosession -noPlugin"Configuración saltos de línea: git config --global core.autocrlf true (Windows) git config --global core.autocrlf input (UNIX)
Fundamentos yFundamentos yarquitectura internaarquitectura interna
de Gitde Git
Git avanzado
Fundamentos de Git
Working directoryRepositorioCommits (snapshots)Stage
Git avanzado
Fundamentos de Git
ReferenciasRamasHEADTags
Git avanzado
Fundamentos de Git
Tipos de tags:LigeraAnotada
Añadir tag ligera: git tag nombre_tag [commit]Añadir tag anotada: git tag -a nombre_tag -m "Mensaje tag" [commit]
Git avanzado
Fundamentos de Git
Ignorar archivos y carpetas con .gitignoreGenerador de .gitignore
Git avanzado
CommitsCommits
Git avanzado
Preparando el commit
Añadir nuevos archivos al índice (empezar a versionar): git add <path>Añadir modificaciones al stage: git add <path>Información sobre el estado de las tres zonas: git statusQuitar modificaciones del stage: git reset HEAD <path>Deshacer cambios del Working Directory: git checkout -- <path> (operación irreversible)
Git avanzado
Preparando el commitBorrar archivos: git rm pathSacar un archivo del repositorio sin borrarlo en elWorking Directory: git rm --cached 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
El commit
Autor / commiteadorFechaMensajePadre/sHash SHA-1
Git avanzado
El log
Git avanzado
Ver el histórico de commits: git log [rama]Ver el log compacto: git log --onelineVer el log de todas las ramas: git log --branchesVer ramificaciones en el log: git log --graphCrear un alias: git config --global alias.milog "log --oneline --branches--graph"Ver el contenido de un commit: git show <commit>
El log
Cómo referenciar a un commitPor su identificador: hash SHA-1Por su posición respecto al HEAD: HEAD^, HEAD^2... HEAD~, HEAD~2...Por el nombre de una ramaPor su posición en el listado de reflog: HEAD@{n}
Git avanzado
El log
Saltar a otro commit o rama: git checkout <commit o rama>Borrar commits: git reset <commit> [--soft|--mixed|--hard]Ver el histórico de HEADs con git reflogCulpar con git blame path
Git avanzado
El log
Apartar cambios provisionalmentegit stash [push -m "Mensaje"]git stash listgit stash show [stash@{n}] [-p]git stash apply [stash@{n}]git stash pop [stash@{n}]git stash drop [stash@{n}]
Git avanzado
Cómo deshacer
Git avanzado
Deshacer cambios en el Working DirectoryDeshacer subidas al stageDeshacer commitsDeshacer un commit --amendDeshacer un resetResolver problemas derivados del Detached HEADIgnorar archivos que ya están siendo versionados
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
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
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 masterMúltiples ramas
Git avanzado
Ramas
Listar ramas: git branchCrear una rama: git branch nombre_rama [commit]Ir a una rama: git checkout nombre_ramaCrear rama e ir a ella: git checkout -b nombre_ramaBorrar una rama: git branch -d/-D nombre_ramaRenombrar una rama: git branch -m nombre_antiguo nombre_nuevo
Git avanzado
Ramas - merge
Git avanzado
HEADdevelop
C1
C2
C5
C6
C7
C3
C4
Fusionar ramasVolcar el trabajo de una rama en otraObjetivo: que una rama tenga los commits de otraTipos de merge:
Fast forward: no crea un nuevo commit, sin conflictosMerge a tres bandas: crea un nuevo commit, posibilidadde conflictos
Conflictos: lanzar siempre git status
Ramas - merge
Git avanzado
Ramas - rebase
Git avanzado
HEADdevelop
C1
C2
C5
C6
C7
C3
C4
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 remoto
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 merge rama_destino
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
Git avanzado
Los remotes: el remote originAñadir un remote: git remote add nombre_remote URL_remoteRenombrar un remote: git remote rename nombre_actual nuevo_nombreCambiar la URL de un remote: git remote set-url nombre_remote URL_remoteBorrar un remote: git remote remove nombre_remote
Repositorios remotos
Git avanzado
Clonar un repositorio remoto: git clone URL [directorio]Ver ramas remotas: git branch -aTrackear rama: git branch --set-upstream-to nombre_remote/nombre_ramaVer ramas trackeadas: git branch -vv
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: git fetchTraer cambios del remoto: git fetch + git merge = git pull git fetch + git rebase = git pull --rebaseSi siempre queremos pull --rebase: git config --global pull.rebase trueSubir tags al remoto: git push --tags
Git avanzado
Repositorios remotos
Borrar ramas del remotoMarcar ramas remotas borradas: git fetch --pruneConfigurar prune por defecto: git config [--global|--system] 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
Git & MavenGit & Maven
Git avanzado
Git & Maven
Git avanzado
Añadir al .gitignore los directorios de builds y dedependencias
de .gitignore concreto para Java y Maven
Si hay jerarquía de proyectos/módulos: submódulosGit
GeneradorEjemplo
Git & Maven - Submódulos
Git avanzado
Añadir un submódulo al módulo padre: git submodule add URL [subcarpeta]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
Actualizar submódulos a la última versión: git submodule update --remote [nombre_submódulo]
Git & Maven - Maven SCM plugin
Git avanzado
Integra a Maven con GitCuando hacemos una release con Maven, tambiénañade un commit y un tag al repositorio GitNos permite lanzar comandos Git en cualquier faseConfiguración en el pom.xml:
<project ...> ... <scm> <url>https://bitbucket.org/git-valencia-2/facturas/src/master</url> <connection>scm:git:https://[email protected]/git-valencia-2/facturas.git</connection> <developerConnection>scm:git:https://[email protected]/git-valencia-2/facturas.git</de </scm> ... </project>
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
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