SlideShare ist ein Scribd-Unternehmen logo
1 von 42
Downloaden Sie, um offline zu lesen
nuestro de cada día
Nociones y algo más
Alan Descoins
Tryolabs, 2014
Objetivos
● Entender mejor lo que hacemos diariamente
● Hacer menos preguntas (entender el man)
● Mejorar algunas prácticas
● Cometer menos errores
● Hacer algo super puntual ;)
Orígenes y filosofía
● 2005, kernel de Linux
● Eficiencia, diseño simple
● Desarrollo no lineal (miles de
branches en paralelo)
● Completamente distribuído
Distribuído
● Casi toda operación es
local
● Todas las máquinas
tienen TODA la
información
● Contraste SVN, CVS,
etc.
Algo de teoría
● git init inicializa un repositorio
● Crea un único directorio .git en la raíz (no contamina)
● Mini filesystem
● Snapshots, no diferencias!
Git y el contenido
● Tracking de contenido, NO archivos
● Vocabulario: tracked / untracked
● Objetos de git
○ Blob (contenido)
○ Tree (estructura)
○ Commit (apunta a un tree, + data)
○ Tag (apunta a un commit, + data)
SHA-1
Blob
● Un archivo por “contenido”
● SHA-1 del contenido (zlib) + un
header
● Inicialmente, loose object
● Luego packfile (eficiencia,
heurísticas…)
● Ejemplo: find .git/objects -type f
Tree
● Como una estructura de
directorios
● Punteros a blobs u otros trees
● Representa un snapshot
completo del estado
● Ejemplo: git ls-tree <sha-1>
Commit
● Información sobre los trees
● Quién, cuándo, por qué guardó el tree
● Apunta al tree de “más arriba” (top level) del
proyecto
● Jerarquía de árbol
● También SHA-1, diferente hash que el tree
al que apunta
Commit (2)
Tags
● Puntero a un commit
● Información adicional, firma
● Para no tener que acordarse del
SHA-1...
La santa Trinidad
Un contenido puede estar en tres estados
● Committed
● Modified
● Staged
La santa Trinidad (2)
Tres partes un proyecto:
● Working directory
● Staging area (o index)
● .git (repository)
Comandos básicos
● git add - agrega al index (staging)
● git commit - guarda el index actual con el autor,
mensaje, fecha, etc.
● git status - muestra los archivos con diferencias en
working dir, staging, y los untracked
● git diff - lo que cambió pero no está staged
● git diff --cached - lo que va para el próximo commit
● git log
Saltear el staging
● A veces, puede ser más fácil saltear el
staging
● git commit -a | git commit <archivo>
● Agregan automáticamente al staging, luego
commitean
Branches
● Simplemente un puntero a un commit
● Tan rápido como escribir 41 caracteres a un
archivo (SHA-1 + n)
● Por defecto master
● Puntero especial HEAD (branch actual)
● Ejemplo: cat .git/HEAD
Branches (2)
● git checkout
para cambiarse
de branch
Referencias
● El puntero HEAD es un caso particular
● Los tags también: “una branch inamovible”
(lightweight tags)
Ejemplo: find .git/refs
Remotes
● No hay servidor central
● Se pueden agregar varios remotes, copias
externas del repositorio (URL)
● El famoso origin :)
Branches remotas
● Guardan el estado de las branches en los repositorios
remotos
● Son locales, pero no se pueden mover; solo cuando se
hacen operaciones en la red (ej. git fetch).
● Forma <remote>/<branch>
Ejemplo: cat .git/refs/remotes/origin/master
Fetch, push
● git fetch - sincroniza y actualiza branches remotas
(mueve punteros)
● Ej. git fetch <remote>
● git pull - equivalente a git fetch y luego git merge,
mergea la branch local con cambios en la remota
● git push - actualiza branch remota con lo local
● Ej. git push <remote> <branch>
Tracking branches
● Branches locales pueden “seguir” remotas
● Dos posibilidades:
○ git checkout --track <remote>/<branch>
○ git push --set-upstream <remote> <branch>
● Así, al pushear no hay que escribir el
nombre del remote y la branch :)
Merges
● Fast-forward: git es
inteligente y solo necesita
mover un puntero
● Integrar cambios de una branch en otra
Merges (2)
● Three way merge: commit no es ancestro
directo de lo que se mergea (no lineal)
● Git determina el mejor ancestro común
● Se crea un merge commit, especial pues
tiene más de un padre
● Conflictos...
Three way merge
Rebasing
● Otra forma de introducir cambios de una
branch en otra
● Rewind & replay, reescribe los commits
● A partir de un ancestro común
● Historia queda siempre lineal, más allá de
que originalmente fue en paralelo
Rebasing (2)
● git rebase <new-base>
mueve los commits de la
branch actual a la nueva
base
● git rebase -i <new-base>
selecciona acciones para
cada commit
● git pull --rebase
Reglas doradas
● Nunca hacer rebase de una branch que está
pusheada, o pulleaste de otra persona
○ Commits duplicados si se hace merge
○ Discutible: si la branch remota la usa solo uno a modo de backup.
○ Usar git push --force, si se sabe que otros developers no trabajan en
la branch.
● Si se hace rebase para traer cambios de otros
developers al local, hacerlo tan seguido como sea
posible.
Rebase vs Merge
¿Por qué rebase?
● Historial limpio
● Colaboración open-source, muchos lo exigen
● Más fácil code review
¿Por qué merge?
● Más fácil solucionar conflictos
● Menor riesgo
git reset
● Se usa a menudo
● Mal usado, puede generar pérdida de
datos (workdir unsafe)
● Tres opciones más usadas:
○ --soft
○ --mixed
○ --hard
git reset...
● mueve la branch a la que apunta HEAD para que
apunte al commit destino (frena si --soft)
● luego hace que el staging se vea como eso (frena si --
mixed, opción por defecto)
● luego hace que el working dir se vea como eso (si --
hard, es workdir usafe!)
Ejemplos git reset
● Con HEAD en branch dev, hago git reset master
○ ahora dev y master apuntan al mismo commit
● Con HEAD en branch master, hago git reset --hard
origin/master
○ ahora mi branch master es idéntica a la remote
(descartar cambios locales)
● git reset --soft HEAD~
○ Deshace el último commit sin perder cambios
Unstaging de archivos
● Al hacer git reset <file> no especifica branch
ni commit SHA
● Equivalente a git reset --mixed HEAD <file>
● Saca un archivo particular del staging,
opuesto de git add :)
git checkout
● git checkout <branch> es superficialmente
parecido a git reset --hard <branch>
● Dos diferencias:
○ Workdir safe! :D Chequea por pérdida de datos.
○ reset mueve la branch a la que apunta HEAD,
checkout mueve el puntero HEAD.
git checkout de archivo
● git checkout <branch> <file>
○ Al igual que reset, ahora no tiene sentido que mueva
HEAD. Reemplaza solamente <file> en workdir
(workdir usafe!).
○ Sería lo mismo que git reset --hard <branch> <file>
○ Pero ese comando no existe :)
Situaciones comunes (1)
● “Necesito hacer pull pero tengo cambios en
los que estoy trabajando y no quiero
commitear todavía”
○ git stash
○ Es un stack
○ Vaciarlo con git stash pop.
Situaciones comunes (2)
● “Hay un bug en una branch, necesito saber
qué commit lo introdujo”
○ git bisect
○ Búsqueda binaria, conducida por git. Muy fácil!
○ git bisect start
git bisect bad <commit>
git bisect good <commit>
● Probamos en cada paso (git hace checkout)
Situaciones comunes (3)
● “Hice uno (o varios) commits en la branch
equivocada, todavía no pushee!”
○ Si la branch correcta no existe
■ git checkout -b <branch correcta>
■ git reset sobre vieja branch
○ Si la branch ya existía
■ git cherry-pick (o git rebase --onto)
■ git reset sobre vieja branch
Situaciones comunes (4)
● “Tengo muchos cambios en un archivo y
solo quiero comittear parte de ellos”
○ git add -p o git commit -p
○ git va a preguntar por cada parte, si queremos
agregarla o no
Situaciones comunes (5)
● “Necesito cambiar unos commits”
● “Necesito borrar unos commits”
● “Necesito cambiar de orden unos commits”
○ git rebase -i (--interactive)
○ Fácil de usar
○ Reescribiendo la historia, preguntándonos qué
queremos hacer por cada commit
Situaciones comunes (6)
● “Estoy haciendo un merge con muchos
conflictos y quiero volver a como estaba
antes de comenzarlo”
○ git merge --abort
(Imágenes de git-scm y demás ;) )
No aprendió git

Weitere ähnliche Inhalte

Was ist angesagt?

Was ist angesagt? (20)

Introducción a git
Introducción a gitIntroducción a git
Introducción a git
 
Curso: Publicando mi proyecto web en Github
Curso: Publicando mi proyecto web en GithubCurso: Publicando mi proyecto web en Github
Curso: Publicando mi proyecto web en Github
 
Git para-principiantes
Git para-principiantesGit para-principiantes
Git para-principiantes
 
Fundamentos de GIt y Github
Fundamentos de GIt y GithubFundamentos de GIt y Github
Fundamentos de GIt y Github
 
WorkShop: Introducción a GIT
WorkShop: Introducción a GITWorkShop: Introducción a GIT
WorkShop: Introducción a GIT
 
Introducción al uso Git y GitHub para trabajo colaborativo
Introducción al uso Git y GitHub para trabajo colaborativoIntroducción al uso Git y GitHub para trabajo colaborativo
Introducción al uso Git y GitHub para trabajo colaborativo
 
Introducción a git y git hub
Introducción a git y git hubIntroducción a git y git hub
Introducción a git y git hub
 
Git: control de versiones
Git: control de versionesGit: control de versiones
Git: control de versiones
 
Control de versiones con Git
Control de versiones con GitControl de versiones con Git
Control de versiones con Git
 
Git + Github - Betabeers Córdoba XII
Git + Github - Betabeers Córdoba XIIGit + Github - Betabeers Córdoba XII
Git + Github - Betabeers Córdoba XII
 
Tallerintroducciongit
TallerintroducciongitTallerintroducciongit
Tallerintroducciongit
 
Taller breve de introduccion a Git
Taller breve de introduccion a GitTaller breve de introduccion a Git
Taller breve de introduccion a Git
 
Uso practico de git
Uso practico de gitUso practico de git
Uso practico de git
 
Un modelo exitoso para git
Un modelo exitoso para gitUn modelo exitoso para git
Un modelo exitoso para git
 
Introducción a GIT
Introducción a GITIntroducción a GIT
Introducción a GIT
 
Git: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativoGit: flujos de trabajo y herramientas para trabajo colaborativo
Git: flujos de trabajo y herramientas para trabajo colaborativo
 
Introducción a Git
Introducción a GitIntroducción a Git
Introducción a Git
 
Herramientas de trabajo para entorno LAMP
Herramientas de trabajo para entorno LAMPHerramientas de trabajo para entorno LAMP
Herramientas de trabajo para entorno LAMP
 
Control de versiones con GIT
Control de versiones con GITControl de versiones con GIT
Control de versiones con GIT
 
LaTeX y Git: ¿Cómo controlar archivos de LaTeX eficientemente?
LaTeX y Git: ¿Cómo controlar archivos de LaTeX eficientemente? LaTeX y Git: ¿Cómo controlar archivos de LaTeX eficientemente?
LaTeX y Git: ¿Cómo controlar archivos de LaTeX eficientemente?
 

Andere mochten auch

Manual sistema de gestión de calida1
Manual sistema de gestión de calida1Manual sistema de gestión de calida1
Manual sistema de gestión de calida1
tiburoneza
 

Andere mochten auch (19)

Jenkins, no me rompas los builds!
Jenkins, no me rompas los builds!Jenkins, no me rompas los builds!
Jenkins, no me rompas los builds!
 
Integración contínua con Jenkins
Integración contínua con JenkinsIntegración contínua con Jenkins
Integración contínua con Jenkins
 
Resolución de conflictos en git
Resolución de conflictos en gitResolución de conflictos en git
Resolución de conflictos en git
 
Java mission control para monitoreo, administración y profilig de aplicacione...
Java mission control para monitoreo, administración y profilig de aplicacione...Java mission control para monitoreo, administración y profilig de aplicacione...
Java mission control para monitoreo, administración y profilig de aplicacione...
 
La he liado parda
La he liado pardaLa he liado parda
La he liado parda
 
Minicurso Git
Minicurso GitMinicurso Git
Minicurso Git
 
Internship Altares - International business coordinator
Internship Altares - International business coordinatorInternship Altares - International business coordinator
Internship Altares - International business coordinator
 
Introducción MongoDB con Java
Introducción MongoDB con JavaIntroducción MongoDB con Java
Introducción MongoDB con Java
 
Gestión de infraestructura tomcat tom ee con tfactory
Gestión de infraestructura tomcat tom ee con tfactoryGestión de infraestructura tomcat tom ee con tfactory
Gestión de infraestructura tomcat tom ee con tfactory
 
Java mission control para monitoreo, administración y profilig de aplicacion...
Java mission control para monitoreo, administración y profilig de aplicacion...Java mission control para monitoreo, administración y profilig de aplicacion...
Java mission control para monitoreo, administración y profilig de aplicacion...
 
Ecuador jug 2017 -incrementando la productividad de proyectos java ee con c...
Ecuador jug   2017 -incrementando la productividad de proyectos java ee con c...Ecuador jug   2017 -incrementando la productividad de proyectos java ee con c...
Ecuador jug 2017 -incrementando la productividad de proyectos java ee con c...
 
Bases del Concurso Público para el Otorgamiento de Autorizaciones
Bases del Concurso Público para el Otorgamiento de Autorizaciones Bases del Concurso Público para el Otorgamiento de Autorizaciones
Bases del Concurso Público para el Otorgamiento de Autorizaciones
 
Business Voice January 2011
Business Voice January 2011Business Voice January 2011
Business Voice January 2011
 
The Five Sentence E-mail
The Five Sentence E-mailThe Five Sentence E-mail
The Five Sentence E-mail
 
Presentacion bienestar2
Presentacion bienestar2Presentacion bienestar2
Presentacion bienestar2
 
Program 2016
Program 2016Program 2016
Program 2016
 
Agenda barcelona www.mundoespiritual.net
Agenda barcelona www.mundoespiritual.netAgenda barcelona www.mundoespiritual.net
Agenda barcelona www.mundoespiritual.net
 
La dematerializzazione dei contratti
La dematerializzazione dei contrattiLa dematerializzazione dei contratti
La dematerializzazione dei contratti
 
Manual sistema de gestión de calida1
Manual sistema de gestión de calida1Manual sistema de gestión de calida1
Manual sistema de gestión de calida1
 

Ähnlich wie El git nuestro de cada dia

Presentación GitHub Antonio Luque Bravo y Miguel Ángel Zamora Blanco
Presentación GitHub Antonio Luque Bravo y Miguel Ángel Zamora BlancoPresentación GitHub Antonio Luque Bravo y Miguel Ángel Zamora Blanco
Presentación GitHub Antonio Luque Bravo y Miguel Ángel Zamora Blanco
Antonio Luque Bravo
 

Ähnlich wie El git nuestro de cada dia (20)

Git windows
Git windowsGit windows
Git windows
 
Intro a GIT
Intro a GITIntro a GIT
Intro a GIT
 
Taller Git en la URJC
Taller Git en la URJC Taller Git en la URJC
Taller Git en la URJC
 
Git
GitGit
Git
 
Git & GitHub Part II
Git & GitHub Part IIGit & GitHub Part II
Git & GitHub Part II
 
Git y drupal
Git y drupalGit y drupal
Git y drupal
 
Git with gifs
Git with gifsGit with gifs
Git with gifs
 
Uso de git: un caso real
Uso de git: un caso realUso de git: un caso real
Uso de git: un caso real
 
Sistemas de control de versiones
Sistemas de control de versionesSistemas de control de versiones
Sistemas de control de versiones
 
Git workflow
Git workflowGit workflow
Git workflow
 
Git workflow v2
Git workflow  v2Git workflow  v2
Git workflow v2
 
Git - Gitlab
Git - GitlabGit - Gitlab
Git - Gitlab
 
Git 101+
Git 101+Git 101+
Git 101+
 
Git
GitGit
Git
 
Uso de git para el mantenimiento de parches locales o públicos
Uso de git para el mantenimiento  de parches locales o públicosUso de git para el mantenimiento  de parches locales o públicos
Uso de git para el mantenimiento de parches locales o públicos
 
Mejora tu productividad con git
Mejora tu productividad con gitMejora tu productividad con git
Mejora tu productividad con git
 
Git Primeros pasos
Git Primeros pasosGit Primeros pasos
Git Primeros pasos
 
GIT presentación de teoría y practica.pdf
GIT presentación de teoría y practica.pdfGIT presentación de teoría y practica.pdf
GIT presentación de teoría y practica.pdf
 
Presentación GitHub Antonio Luque Bravo y Miguel Ángel Zamora Blanco
Presentación GitHub Antonio Luque Bravo y Miguel Ángel Zamora BlancoPresentación GitHub Antonio Luque Bravo y Miguel Ángel Zamora Blanco
Presentación GitHub Antonio Luque Bravo y Miguel Ángel Zamora Blanco
 
Flujo de trabajo básico con git
Flujo de trabajo básico con gitFlujo de trabajo básico con git
Flujo de trabajo básico con git
 

Kürzlich hochgeladen

NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
UPTAIDELTACHIRA
 
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
MiNeyi1
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Francisco158360
 
PLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxPLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docx
lupitavic
 

Kürzlich hochgeladen (20)

Tema 17. Biología de los microorganismos 2024
Tema 17. Biología de los microorganismos 2024Tema 17. Biología de los microorganismos 2024
Tema 17. Biología de los microorganismos 2024
 
Abril 2024 - Maestra Jardinera Ediba.pdf
Abril 2024 -  Maestra Jardinera Ediba.pdfAbril 2024 -  Maestra Jardinera Ediba.pdf
Abril 2024 - Maestra Jardinera Ediba.pdf
 
Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024Prueba libre de Geografía para obtención título Bachillerato - 2024
Prueba libre de Geografía para obtención título Bachillerato - 2024
 
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdfNUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
NUEVAS DIAPOSITIVAS POSGRADO Gestion Publica.pdf
 
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
Procedimientos para la planificación en los Centros Educativos tipo V ( multi...
 
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
6.-Como-Atraer-El-Amor-01-Lain-Garcia-Calvo.pdf
 
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptxSEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
SEXTO SEGUNDO PERIODO EMPRENDIMIENTO.pptx
 
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdfCurso = Metodos Tecnicas y Modelos de Enseñanza.pdf
Curso = Metodos Tecnicas y Modelos de Enseñanza.pdf
 
AFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA II
AFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA IIAFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA II
AFICHE EL MANIERISMO HISTORIA DE LA ARQUITECTURA II
 
Unidad 3 | Metodología de la Investigación
Unidad 3 | Metodología de la InvestigaciónUnidad 3 | Metodología de la Investigación
Unidad 3 | Metodología de la Investigación
 
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdfTema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
Tema 8.- PROTECCION DE LOS SISTEMAS DE INFORMACIÓN.pdf
 
PLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docxPLAN DE REFUERZO ESCOLAR primaria (1).docx
PLAN DE REFUERZO ESCOLAR primaria (1).docx
 
Dinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes dDinámica florecillas a María en el mes d
Dinámica florecillas a María en el mes d
 
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESOPrueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
Prueba de evaluación Geografía e Historia Comunidad de Madrid 4ºESO
 
Tema 11. Dinámica de la hidrosfera 2024
Tema 11.  Dinámica de la hidrosfera 2024Tema 11.  Dinámica de la hidrosfera 2024
Tema 11. Dinámica de la hidrosfera 2024
 
Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...Caja de herramientas de inteligencia artificial para la academia y la investi...
Caja de herramientas de inteligencia artificial para la academia y la investi...
 
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICABIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
BIOMETANO SÍ, PERO NO ASÍ. LA NUEVA BURBUJA ENERGÉTICA
 
Sesión de clase: Fe contra todo pronóstico
Sesión de clase: Fe contra todo pronósticoSesión de clase: Fe contra todo pronóstico
Sesión de clase: Fe contra todo pronóstico
 
Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024Interpretación de cortes geológicos 2024
Interpretación de cortes geológicos 2024
 
ACTIVIDAD DIA DE LA MADRE FICHA DE TRABAJO
ACTIVIDAD DIA DE LA MADRE FICHA DE TRABAJOACTIVIDAD DIA DE LA MADRE FICHA DE TRABAJO
ACTIVIDAD DIA DE LA MADRE FICHA DE TRABAJO
 

El git nuestro de cada dia

  • 1. nuestro de cada día Nociones y algo más Alan Descoins Tryolabs, 2014
  • 2. Objetivos ● Entender mejor lo que hacemos diariamente ● Hacer menos preguntas (entender el man) ● Mejorar algunas prácticas ● Cometer menos errores ● Hacer algo super puntual ;)
  • 3. Orígenes y filosofía ● 2005, kernel de Linux ● Eficiencia, diseño simple ● Desarrollo no lineal (miles de branches en paralelo) ● Completamente distribuído
  • 4. Distribuído ● Casi toda operación es local ● Todas las máquinas tienen TODA la información ● Contraste SVN, CVS, etc.
  • 5. Algo de teoría ● git init inicializa un repositorio ● Crea un único directorio .git en la raíz (no contamina) ● Mini filesystem ● Snapshots, no diferencias!
  • 6. Git y el contenido ● Tracking de contenido, NO archivos ● Vocabulario: tracked / untracked ● Objetos de git ○ Blob (contenido) ○ Tree (estructura) ○ Commit (apunta a un tree, + data) ○ Tag (apunta a un commit, + data) SHA-1
  • 7. Blob ● Un archivo por “contenido” ● SHA-1 del contenido (zlib) + un header ● Inicialmente, loose object ● Luego packfile (eficiencia, heurísticas…) ● Ejemplo: find .git/objects -type f
  • 8. Tree ● Como una estructura de directorios ● Punteros a blobs u otros trees ● Representa un snapshot completo del estado ● Ejemplo: git ls-tree <sha-1>
  • 9. Commit ● Información sobre los trees ● Quién, cuándo, por qué guardó el tree ● Apunta al tree de “más arriba” (top level) del proyecto ● Jerarquía de árbol ● También SHA-1, diferente hash que el tree al que apunta
  • 11. Tags ● Puntero a un commit ● Información adicional, firma ● Para no tener que acordarse del SHA-1...
  • 12. La santa Trinidad Un contenido puede estar en tres estados ● Committed ● Modified ● Staged
  • 13. La santa Trinidad (2) Tres partes un proyecto: ● Working directory ● Staging area (o index) ● .git (repository)
  • 14. Comandos básicos ● git add - agrega al index (staging) ● git commit - guarda el index actual con el autor, mensaje, fecha, etc. ● git status - muestra los archivos con diferencias en working dir, staging, y los untracked ● git diff - lo que cambió pero no está staged ● git diff --cached - lo que va para el próximo commit ● git log
  • 15. Saltear el staging ● A veces, puede ser más fácil saltear el staging ● git commit -a | git commit <archivo> ● Agregan automáticamente al staging, luego commitean
  • 16. Branches ● Simplemente un puntero a un commit ● Tan rápido como escribir 41 caracteres a un archivo (SHA-1 + n) ● Por defecto master ● Puntero especial HEAD (branch actual) ● Ejemplo: cat .git/HEAD
  • 17. Branches (2) ● git checkout para cambiarse de branch
  • 18. Referencias ● El puntero HEAD es un caso particular ● Los tags también: “una branch inamovible” (lightweight tags) Ejemplo: find .git/refs
  • 19. Remotes ● No hay servidor central ● Se pueden agregar varios remotes, copias externas del repositorio (URL) ● El famoso origin :)
  • 20. Branches remotas ● Guardan el estado de las branches en los repositorios remotos ● Son locales, pero no se pueden mover; solo cuando se hacen operaciones en la red (ej. git fetch). ● Forma <remote>/<branch> Ejemplo: cat .git/refs/remotes/origin/master
  • 21. Fetch, push ● git fetch - sincroniza y actualiza branches remotas (mueve punteros) ● Ej. git fetch <remote> ● git pull - equivalente a git fetch y luego git merge, mergea la branch local con cambios en la remota ● git push - actualiza branch remota con lo local ● Ej. git push <remote> <branch>
  • 22. Tracking branches ● Branches locales pueden “seguir” remotas ● Dos posibilidades: ○ git checkout --track <remote>/<branch> ○ git push --set-upstream <remote> <branch> ● Así, al pushear no hay que escribir el nombre del remote y la branch :)
  • 23. Merges ● Fast-forward: git es inteligente y solo necesita mover un puntero ● Integrar cambios de una branch en otra
  • 24. Merges (2) ● Three way merge: commit no es ancestro directo de lo que se mergea (no lineal) ● Git determina el mejor ancestro común ● Se crea un merge commit, especial pues tiene más de un padre ● Conflictos...
  • 26. Rebasing ● Otra forma de introducir cambios de una branch en otra ● Rewind & replay, reescribe los commits ● A partir de un ancestro común ● Historia queda siempre lineal, más allá de que originalmente fue en paralelo
  • 27. Rebasing (2) ● git rebase <new-base> mueve los commits de la branch actual a la nueva base ● git rebase -i <new-base> selecciona acciones para cada commit ● git pull --rebase
  • 28. Reglas doradas ● Nunca hacer rebase de una branch que está pusheada, o pulleaste de otra persona ○ Commits duplicados si se hace merge ○ Discutible: si la branch remota la usa solo uno a modo de backup. ○ Usar git push --force, si se sabe que otros developers no trabajan en la branch. ● Si se hace rebase para traer cambios de otros developers al local, hacerlo tan seguido como sea posible.
  • 29. Rebase vs Merge ¿Por qué rebase? ● Historial limpio ● Colaboración open-source, muchos lo exigen ● Más fácil code review ¿Por qué merge? ● Más fácil solucionar conflictos ● Menor riesgo
  • 30. git reset ● Se usa a menudo ● Mal usado, puede generar pérdida de datos (workdir unsafe) ● Tres opciones más usadas: ○ --soft ○ --mixed ○ --hard
  • 31. git reset... ● mueve la branch a la que apunta HEAD para que apunte al commit destino (frena si --soft) ● luego hace que el staging se vea como eso (frena si -- mixed, opción por defecto) ● luego hace que el working dir se vea como eso (si -- hard, es workdir usafe!)
  • 32. Ejemplos git reset ● Con HEAD en branch dev, hago git reset master ○ ahora dev y master apuntan al mismo commit ● Con HEAD en branch master, hago git reset --hard origin/master ○ ahora mi branch master es idéntica a la remote (descartar cambios locales) ● git reset --soft HEAD~ ○ Deshace el último commit sin perder cambios
  • 33. Unstaging de archivos ● Al hacer git reset <file> no especifica branch ni commit SHA ● Equivalente a git reset --mixed HEAD <file> ● Saca un archivo particular del staging, opuesto de git add :)
  • 34. git checkout ● git checkout <branch> es superficialmente parecido a git reset --hard <branch> ● Dos diferencias: ○ Workdir safe! :D Chequea por pérdida de datos. ○ reset mueve la branch a la que apunta HEAD, checkout mueve el puntero HEAD.
  • 35. git checkout de archivo ● git checkout <branch> <file> ○ Al igual que reset, ahora no tiene sentido que mueva HEAD. Reemplaza solamente <file> en workdir (workdir usafe!). ○ Sería lo mismo que git reset --hard <branch> <file> ○ Pero ese comando no existe :)
  • 36. Situaciones comunes (1) ● “Necesito hacer pull pero tengo cambios en los que estoy trabajando y no quiero commitear todavía” ○ git stash ○ Es un stack ○ Vaciarlo con git stash pop.
  • 37. Situaciones comunes (2) ● “Hay un bug en una branch, necesito saber qué commit lo introdujo” ○ git bisect ○ Búsqueda binaria, conducida por git. Muy fácil! ○ git bisect start git bisect bad <commit> git bisect good <commit> ● Probamos en cada paso (git hace checkout)
  • 38. Situaciones comunes (3) ● “Hice uno (o varios) commits en la branch equivocada, todavía no pushee!” ○ Si la branch correcta no existe ■ git checkout -b <branch correcta> ■ git reset sobre vieja branch ○ Si la branch ya existía ■ git cherry-pick (o git rebase --onto) ■ git reset sobre vieja branch
  • 39. Situaciones comunes (4) ● “Tengo muchos cambios en un archivo y solo quiero comittear parte de ellos” ○ git add -p o git commit -p ○ git va a preguntar por cada parte, si queremos agregarla o no
  • 40. Situaciones comunes (5) ● “Necesito cambiar unos commits” ● “Necesito borrar unos commits” ● “Necesito cambiar de orden unos commits” ○ git rebase -i (--interactive) ○ Fácil de usar ○ Reescribiendo la historia, preguntándonos qué queremos hacer por cada commit
  • 41. Situaciones comunes (6) ● “Estoy haciendo un merge con muchos conflictos y quiero volver a como estaba antes de comenzarlo” ○ git merge --abort
  • 42. (Imágenes de git-scm y demás ;) ) No aprendió git