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

Git Internals

Git Internals

Explicación básica de las estructuras internas de git y como interactuan los principales comandos de git con ellas.

Jesús Espino

April 19, 2013
Tweet

More Decks by Jesús Espino

Other Decks in Programming

Transcript

  1. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Git Internals Jes´ us Espino Garc´ ıa [email protected] @jespinog 19 de Abril de 2013 Jes´ us Espino Garc´ ıa Git Internals
  2. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar ¿Por qu´ e? La interfaz de git es de bajo nivel. Conocer git bien da mucho poder. El poder est´ a ah´ ı aunque no lo conozcamos. Un gran poder conlleva una gran responsabilidad. Jes´ us Espino Garc´ ıa Git Internals
  3. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Conceptos b´ asicos Porcelain (Porcelana). Plumbing (Ca˜ nerias). Objetos Referencias Head Working copy Jes´ us Espino Garc´ ıa Git Internals
  4. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Contenido de .git Ficheros. HEAD index config Directorios. objects refs hooks info Jes´ us Espino Garc´ ıa Git Internals
  5. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Objetos Bloque de datos almacenado en git Referenciado por el sha1 de su contenido Almacenados en el directorio .git/objects/ (o en packs). Hay 4 tipos de objetos en git (blob, tree, commit, tag). Jes´ us Espino Garc´ ıa Git Internals
  6. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar blobs Ser´ a el nodo hoja de nuestros ´ arboles. Ser´ a equivalente (normalmente) a nuestros ficheros. Jes´ us Espino Garc´ ıa Git Internals
  7. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Ejemplo de almacenar blob git init repo; cd repo echo ’version 1’ | git hash-object -w --stdin find .git/objects -type f git cat-file -p 83baae61804e65cc73a7201a7252750c76066a30 echo ’version 2’ | git hash-object -w --stdin find .git/objects -type f git cat-file -p 1f7a7a472abf3dd9643fd615f6da379c4acb3e3a Jes´ us Espino Garc´ ıa Git Internals
  8. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar trees Es un directorio de referencias a blob y otros trees. Almacena referencias (sha1 de objetos) y metadatos. Jes´ us Espino Garc´ ıa Git Internals
  9. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar diagrama de ejemplo de trees Jes´ us Espino Garc´ ıa Git Internals
  10. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Ejemplo de almacenar tree git init repo; cd repo git update-index --add --cacheinfo 100644 \ 83baae61804e65cc73a7201a7252750c76066a30 test.txt git write-tree find .git/objects -type f git cat-file -p d8329fc1cc938780ffdd9f94e0d364e0ea74f579 Jes´ us Espino Garc´ ıa Git Internals
  11. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar commits Almacena una referencia a un tree. Almacena una referencia a su commit padre. Almacena metadatos del commit (autor, fecha, mensaje...) Jes´ us Espino Garc´ ıa Git Internals
  12. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar diagrama de ejemplo de commits Jes´ us Espino Garc´ ıa Git Internals
  13. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Ejemplo de commit git init repo; cd repo echo "Version 1" > fichero.txt; git add fichero.txt git commit -m "Version 1" find .git/objects -type f git cat-file -p HEAD git cat-file -p b7c0dba424af1e98a3570f8125476126129e5c32 git cat-file -p fb8247c7b27ae4cad9e7e3e66ba95126658ea7c2 Jes´ us Espino Garc´ ıa Git Internals
  14. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar tags Almacena una referencia a un commit. Almacena metadatos del commit (autor, fecha, nombre...) Jes´ us Espino Garc´ ıa Git Internals
  15. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Objects storage Se a˜ nade 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´ a como nombre del objeto. Se comprime con zlib. Se almacena en .git/objects/XX/XXXXXX. . . Jes´ us Espino Garc´ ıa Git Internals
  16. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Ejemplo de lectura directa git init repo; cd repo echo "Version 1" > fichero.txt; git add fichero.txt git commit -m "Version 1" find .git/objects -type f git cat-file -p HEAD git cat-file -p b7c0dba424af1e98a3570f8125476126129e5c32 git cat-file -p fb8247c7b27ae4cad9e7e3e66ba95126658ea7c2 cat .git/objects/fb/8247c7b27ae4cad9e7e3e66ba95126658ea7c2 \ | zlib-flate -uncompress Jes´ us Espino Garc´ ıa Git Internals
  17. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Packfiles Paquetes de objetos. Peri´ odicamente 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/. Jes´ us Espino Garc´ ıa Git Internals
  18. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Referencias Est´ an en .git/refs principalmente. Son punteros a objetos. Contienen el id del objeto al que apuntan. Jes´ us Espino Garc´ ıa Git Internals
  19. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar branchs Est´ an en .git/refs/heads Jes´ us Espino Garc´ ıa Git Internals
  20. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar HEAD Est´ a en .git/HEAD Es una referencia simb´ olica que apunta a la referencia de la rama actual. Jes´ us Espino Garc´ ıa Git Internals
  21. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar tags Est´ an en .git/refs/tags Son referencias a commits o a objetos tag. Los tags simples son una referencia directa a un commit. Los tags con anotaciones son referencias a un objeto tag que apunta a un commit. Jes´ us Espino Garc´ ıa Git Internals
  22. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar remotes Est´ an en .git/refs/remotes Contiene las referencias de mis remotes. Se actualizan cuando hago push o fetch. Jes´ us Espino Garc´ ıa Git Internals
  23. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Reflog Log de cambios de las referencias Cada referencia tiene su log de cambios en .git/logs/ Jes´ us Espino Garc´ ıa Git Internals
  24. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Refspects Forma de definir la relaci´ on entre las referencias de diferentes origins Tienen el formato [+]<src>:<dst> Opcionalmente se pone un + para actualizar la referencia cuando no hay fast-forward. Las referencias pueden tener * para definir ”todo lo que haya en un directorio” No se permite el uso de * para selecciones parciales de referencias. Ejemplo: +refs/heads/*:refs/remotes/origin/* Jes´ us Espino Garc´ ıa Git Internals
  25. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Pulling with refspects Ejemplo: git fetch origin master:refs/remotes/origin/mymaster Descarga la referencia master del origin a refs/remotes/origin/mymaster en local Jes´ us Espino Garc´ ıa Git Internals
  26. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Pushing with refspects Ejemplo: git push origin master:refs/heads/qa/master Env´ ıa la referencia master local al refs/heads/qa/master en origin Jes´ us Espino Garc´ ıa Git Internals
  27. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Borrando referencias Ejemplo: git push origin :topic Borra la referencia topic en origin Jes´ us Espino Garc´ ıa Git Internals
  28. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar init Crea un .git con datos b´ asicos. Un fichero config por defecto. Los directorios refs, objects e info. Un HEAD apuntando a la referencia master. Y poco m´ as Jes´ us Espino Garc´ ıa Git Internals
  29. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar add A˜ nade el fichero a la base de datos de Objetos. A˜ nade el fichero al index. Jes´ us Espino Garc´ ıa Git Internals
  30. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar commit A˜ nade el tree apuntando al ´ arbol de ficheros al que apunte el index a la base de datos de objetos. A˜ nade el commit apunte al tree reci´ en a˜ nadido a la base de datos de objetos. Modifica el HEAD. Modifica la referencia de la rama actual. Jes´ us Espino Garc´ ıa Git Internals
  31. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar checkout Compara el tree del commit actual y el tree del commit destino. Extrae los objetos diferentes entre ambos a la working copy. Si existen ficheros modificados intenta hacer el merge y conservar las modificaciones. Modifica el HEAD. Jes´ us Espino Garc´ ıa Git Internals
  32. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar reset Modifica la referencia a la que apunte HEAD y la apunta al commit que le digas. Depende del tipo de reset modifica el index para ajustarlo al nuevo commit. Depende del tipo de reset modifica la working copy para ajustarlo al nuevo commit. Jes´ us Espino Garc´ ıa Git Internals
  33. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar rebase Se posiciona en la rama destino. A˜ nade los commits de la rama origen uno a uno en la rama destino. Si hay conflicto los resuelve (autom´ atica o manualmente) modificando el commit. Actualiza la referencia de ambas ramas para apuntar al ´ ultimo commit. Jes´ us Espino Garc´ ıa Git Internals
  34. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar merge Pregunta por el origen com´ un de las ramas a mergear. Calcula las diferencias que genera cada rama. Intenta mezclar las diferencias en un nuevo commit. Si hay conflicto los resuelve (autom´ atica o manualmente). Genera un objeto commit (con varios parents) con las diferencias de ambos aplicadas. Actualiza la referencia de la rama destino al nuevo commit. Jes´ us Espino Garc´ ıa Git Internals
  35. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar stash Almacena todos los blobs y trees de mis cambios actuales. Genera y almacena un commit a partir de los cambios actuales. Actualiza la referencia .git/refs/stash. Esta acci´ on a˜ nade una entrada al reflog de la referencia stash. Cuando hacemos un stash pop aplicamos el commit y eliminamos la ultima entrada del reflog. Jes´ us Espino Garc´ ıa Git Internals
  36. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar ¿De qu´ e no hemos hablado? M´ as comandos de porcelana. Comandos de plumbing. Protocolos de transferencia. Mantenimiento y recuperaci´ on de datos. fsck Other files internal format (index, packs, pack-idx. . . ) Jes´ us Espino Garc´ ıa Git Internals
  37. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Referencias http://git-scm.com/ - Web oficial de git. http://git-scm.com/book - ProGit (El libro de Git). Documentation/technical - Technical doc in the git respoitory. http://gitguys.com/ - P´ agina sobre git. http://github.com/ - Servicio de git por excelencia. http://bitbucket.org/ - Servicio de git de repositorios privados gratis. Jes´ us Espino Garc´ ıa Git Internals
  38. Introducci´ on Objetos Packfiles Referencias Hablemos de algunos comandos Para

    terminar Dudas . . . Jes´ us Espino Garc´ ıa Git Internals