Buscar..
Repo
Un git repository es una estructura de datos en disco que almacena metadatos para un conjunto de archivos y directorios.
Vive en la carpeta .git/ tu proyecto. Cada vez que ingresas datos a git, se almacenan aquí. A la inversa, .git/ contiene cada confirmación individual.
Su estructura básica es así:
.git/
objects/
refs/
Objetos
git es fundamentalmente un almacén de clave-valor. Cuando agrega datos a git , construye un object y usa el hash SHA-1 del contenido del object como una clave.
Por lo tanto, cualquier contenido en git puede ser buscado por su hash:
git cat-file -p 4bb6f98
Hay 4 tipos de Object :
-
blob -
tree -
commit -
tag
CABEZA ref
HEAD es una ref especial. Siempre apunta al objeto actual.
Puede ver dónde está apuntando actualmente al revisar el archivo .git/HEAD .
Normalmente, HEAD apunta a otra ref :
$cat .git/HEAD
ref: refs/heads/mainline
Pero también puede apuntar directamente a un object :
$ cat .git/HEAD
4bb6f98a223abc9345a0cef9200562333
Esto es lo que se conoce como "cabeza desprendida", porque HEAD no está unida a (apuntando a) ninguna ref , sino que apunta directamente a un object .
Refs
Una ref es esencialmente un puntero. Es un nombre que apunta a un object . Por ejemplo,
"master" --> 1a410e...
Se almacenan en `.git / refs / heads / en archivos de texto plano.
$ cat .git/refs/heads/mainline
4bb6f98a223abc9345a0cef9200562333
Esto es comúnmente lo que se llaman branches . Sin embargo, notará que en git no existe tal cosa como una branch , solo una ref .
Ahora, es posible navegar git simplemente saltando alrededor de diferentes objects directamente por sus hashes. Pero esto sería terriblemente inconveniente. Una ref le da un nombre conveniente para referirse a los objects por. Es mucho más fácil pedirle a git que vaya a un lugar específico por nombre en lugar de por hash.
Cometer objeto
Una commit es probablemente el tipo de object más familiar para los usuarios de git , ya que es lo que están acostumbrados a crear con los comandos de git commit .
Sin embargo, la commit no contiene directamente ningún archivo o dato modificado. Más bien, contiene principalmente metadatos y punteros a otros objects que contienen el contenido real de la commit .
Un commit contiene algunas cosas:
- hacha de un
tree - hash de un
commitpadre - Nombre del autor / correo electrónico, nombre del comitente / correo electrónico
- cometer mensaje
Puedes ver los contenidos de cualquier commit como este:
$ git cat-file commit 5bac93
tree 04d1daef...
parent b7850ef5...
author Geddy Lee <[email protected]>
commiter Neil Peart <[email protected]>
First commit!
Árbol
Una nota muy importante es que los objetos del tree almacenan CADA archivo en su proyecto, y almacena archivos enteros, no dife. Esto significa que cada commit contiene una instantánea de todo el proyecto *.
* Técnicamente, solo los archivos modificados son almacenados. Pero esto es más un detalle de implementación para la eficiencia. Desde una perspectiva de diseño, se debe considerar que un commit contiene una copia completa del proyecto .
Padre
La línea parent contiene un hash de otro objeto de commit y puede considerarse como un "puntero principal" que apunta a la "confirmación anterior". Esto forma implícitamente un gráfico de confirmaciones conocido como el gráfico de confirmación . Específicamente, es un grafo acíclico dirigido (o DAG).
Objeto de árbol
Un tree representa básicamente una carpeta en un sistema de archivos tradicional: contenedores anidados para archivos u otras carpetas.
Un tree contiene:
- 0 o más objetos
blob - 0 o más objetos de
tree
Al igual que puede usar ls o dir para enumerar los contenidos de una carpeta, puede enumerar los contenidos de un objeto de tree .
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
...
Puede buscar los archivos en una commit encontrando primero el hash del tree en la commit , y luego mirando ese tree :
$ git cat-file commit 4bb6f93a
tree 07b1a631
parent ...
author ...
commiter ...
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
...
Objeto Blob
Un blob contiene contenidos binarios arbitrarios. Comúnmente, será texto sin formato como el código fuente o un artículo de blog. Pero podría ser tan fácil como los bytes de un archivo PNG o cualquier otra cosa.
Si tienes el hash de un blob , puedes ver su contenido.
$ git cat-file -p d429810
package com.example.project
class Foo {
...
}
...
Por ejemplo, puede examinar un tree como se muestra arriba y luego mirar una de las blobs en él.
$ git cat-file -p 07b1a631
100644 blob b91bba1b .gitignore
100644 blob cc0956f1 Makefile
040000 tree 92e1ca7e src
100644 blob cae391ff Readme.txt
$ git cat-file -p cae391ff
Welcome to my project! This is the readmefile
...
Creando nuevos compromisos
El comando git commit hace algunas cosas:
- Cree
blobsytreespara representar el directorio de su proyecto, almacenados en.git/objects - Crea un nuevo objeto de
commitcon su información de autor, mensaje de confirmación y eltreeraíz del paso 1, también almacenado en.git/objects - Actualiza la referencia
HEADen.git/HEADal hash de lacommitrecién creada
Esto da como resultado una nueva instantánea de su proyecto que se agrega a git que está conectada al estado anterior.
Moviendo HEAD
Cuando ejecuta git checkout en un commit (especificado por hash o ref) le está diciendo a git que haga que su directorio de trabajo se vea como lo hizo cuando se tomó la instantánea.
- Actualice los archivos en el directorio de trabajo para que coincidan con el
treedentro de lacommit - Actualice
HEADpara que apunte al hash o ref especificado
Moviendo refs alrededor
Ejecutando git reset --hard mueve git reset --hard al hash / ref especificado.
Moviendo MyBranch a b8dc53 :
$ git checkout MyBranch # moves HEAD to MyBranch
$ git reset --hard b8dc53 # makes MyBranch point to b8dc53
Creando nuevas referencias
Al ejecutar git checkout -b <refname> se creará una nueva referencia que apunta al commit actual.
$ cat .git/head
1f324a
$ git checkout -b TestBranch
$ cat .git/refs/heads/TestBranch
1f324a