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

Git Internals

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.

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.