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
commit
padre - 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
blobs
ytrees
para representar el directorio de su proyecto, almacenados en.git/objects
- Crea un nuevo objeto de
commit
con su información de autor, mensaje de confirmación y eltree
raíz del paso 1, también almacenado en.git/objects
- Actualiza la referencia
HEAD
en.git/HEAD
al hash de lacommit
recié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
tree
dentro de lacommit
- Actualice
HEAD
para 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