Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Git Internals

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

Git Internals

Una explicación en 45 minutos de las estructuras de datos utilizadas internamente por parte de Git para almacenar la información. Veremos cómo acceder y manipular estas estructuras.

Avatar for Jesús Espino

Jesús Espino

January 20, 2015
Tweet

More Decks by Jesús Espino

Other Decks in Programming

Transcript

  1. El contenido del .git • Ficheros ◦ HEAD ◦ index

    ◦ config • Directorios ◦ objects ◦ refs ◦ hooks ◦ info
  2. Objetos • Bloques de datos almacenados en git. • Referenciados

    por el SHA1 de su contenido. • Almacenados en el directorio .git/objects (o en packs). • Existen 4 tipos de objeto: ◦ blob ◦ tree ◦ commit ◦ tag
  3. Blobs • Serán los nodos hoja de nuestro arbol. •

    Equivale (normalmente) a nuestros ficheros.
  4. Trees • Es un directorio que referencia blobs y otros

    trees. • Almacena referencias (sha1 de objetos) y metadatos.
  5. Commits • Almacena una referencia a un tree. • Almacena

    una referencia a cada uno de sus padres. • Almacena metadatos (author, fecha, mensaje…)
  6. Tags • Almacena una referencia a un commit. • Almacena

    metadatos (author, fecha, mensaje…)
  7. Almacenamiento de objetos • Se añade una cabecera con el

    tipo de objeto y la longitud del mismo. • Se concatena con los datos que se van a almacenar • Se calcula su sha1 que se utilizará como nombre del objeto. • Se comprime con zlib. • Se almacena en .git/objects/XX/XXXXXX. . .
  8. Packfiles • Paquetes de objetos. • Periódicamente git empaqueta los

    objetos en packs (gc). • Se almacenan en .git/objects/pack/. • Hay un listado de packs en .git/objects/info/packs. • Cada pack tiene su índice en .git/objects/pack/.
  9. Referencias • Están en .git/refs principalmente. • Son punteros a

    objetos. • Contienen el id del objeto al que apuntan.
  10. HEAD • Es una referencia simbolica que apunta a la

    referencia de la rama actual. • Está en .git/HEAD
  11. Tags • Están en .git/refs/tags • Son referencias a commits

    o a objetos tag. • Los tags simples son una referencia a un commit. • Los tags con anotaciones son una referencia a un objeto tag que apunta a un commit.
  12. Remotes • Están en .git/refs/remotes • Contiene las referencias a

    mis remotes. • Se actualizan cuando hago push o fetch.
  13. Reflog • Log de cambios de las referencias. • Cada

    referencia tiene su log de cambios en .git/logs • El log por defecto de reflog es el de HEAD.
  14. init • Crea un .git con los datos básicos ◦

    Un fichero config por defecto. ◦ Los directorios refs, objects e info. ◦ Un HEAD apuntando a la referencia master. ◦ Y poco más.
  15. add • Añade el fichero a la BBDD de objetos.

    • Añade la referencia del fichero al index.
  16. commit • Añade el tree generado por el index actual

    a la BBDD de objetos. • Añade el commit, que apunte al tree recien añadido y al commit actual como padre, a la BBDD de objetos. • Modifica el HEAD. • Modifica la referencia de la rama actual.
  17. checkout • Compara el tree del commit actual y el

    tree del commit de destino. • Elimina, añade o reemplaza los ficheros diferentes. • Modifica el HEAD.
  18. reset • Modifica la referencia a la que apunte HEAD

    y la apunta al commit que le digas. • Dependiendo del tipo de reset modifica el index para ajustarlo al nuevo commit. • Dependiendo del tipo de resed modifica la working copy para ajustarlo al nuevo commit.
  19. rebase • Se posiciona en la rama origen. • Se

    aplican uno a uno los commits de la rama destino desde el último commit común. • Se actualiza la referencia de la rama destino para que apunte al último commit.
  20. merge • Pregunta por el origen común de las ramas

    a mezclar. • Calcula las diferencias de cada rama. • Mezcla las ambas diferencias. • Genera un commit con tantos padres como ramas a mezclar y con la mezcla de las diferencias aplicada. • Actualiza la referencia de la rama destino a este nuevo commit.
  21. stash • Almacena todos los blobs y trees de mis

    cambios actuales. • Genera y almacena un commit a partir de estos cambios. • Actualiza la referencia .git/refs/stash • Añade una entrada al reflog de la referencia stash • Cuando hacemos stash pop aplicamos los cambios del commit y eliminamos la última entrada del reflog.
  22. ¿Qué nos hemos dejado? • Más comandos de porcelana. •

    Más comandos de plumbing. • Protocolos de transferencia. • Mantenimiento y recuperación de datos. • fsck. • Otros formatos internos de fichero (index, packs, pack- idx…).
  23. References • http://git-scm.com/ - Web oficial de git. • http://git-scm.com/book

    - ProGit (El libro de Git). • Documentation/technical - Documentación técnica en el repositorio de Git.