Entendiendo Git
  • Introduction
  • Nucleo git: como almacena git
  • El primer commit
  • Versionamiento
  • Tags / Etiquetas
  • Branches
  • Merges
  • Rebases
  • Distributed Version Control
  • Social
Powered by GitBook
On this page
  • Pero donde queda almacenado en el modelo de git?
  • Nuevos branches
  • Adicionando los ingredientes para un Apple pie
  • Pero que pasa si quiero cambiar de rama?
  • Adicionando los ingredientes para un Apple pie "otra vez"

Was this helpful?

Branches

PreviousTags / EtiquetasNextMerges

Last updated 5 years ago

Was this helpful?

Git es especial cuando se trata de trabajar con ramas, cuando creamos el primer commit, git se encarga de crear la rama por defecto "Master", lo podemos comprobar con el comando para visualizar branches:

git branch

Pero donde queda almacenado en el modelo de git?

Dentro de la carpeta refs>heads se encuentra el archivo de la rama principal master.

Pero que hay dentro de ese archivo?

Probablemente pensaría que es un archivo comprimido como los blobs anteriores, pero este no esta comprimido por lo que lo puedo consultar de la manera tradicional (sin git):

cat .git/refs/heads/master

resultado:

81e0c75578af8a2e38bbeb4d6ef68876c764368f

solo contiene una sola línea con el hash y como se puede imaginar solo es una referencia sobre el el último commit que a su vez esta referenciado con el commit anterior:

Nuevos branches

Se crean nuevas ramas para separar los contenidos de los archivos que queremos diferenciar del principal, por ejemplo queremos tener recetas de una amiga "Lisa" separadas de las nuestras

git branch lisa

Ahora si consultamos el contenido de ambos archivos "brannches" master y lisa:

cat .git/refs/heads/master
81e0c75578af8a2e38bbeb4d6ef68876c764368f
cat .git/refs/heads/lisa
81e0c75578af8a2e38bbeb4d6ef68876c764368f

vemos que tienen exactamente el mismo hash, es decir:

dos branch apuntando al mismo commit, si consultamos las ramas:

git branch
lisa
*master

El * nos indica el branch actual, pero sonde se almacena esta información, es decir como sabe que master es actualmente el branch seleccionado? Para ello git debió crear un archivo HEAD, lo podemos consultar a ver que contiene (no esta comprimido por git, se consulta de la forma cotidiana):

cat .git/HEAD
ref: refs/heads/master

el contenido esta referenciando a un archivo, master en este caso, dentro de la carpeta refs/heads lo que quiere decir que HEAD esta apuntando a master que a su vez esta apuntando a un último commit:

Adicionando los ingredientes para un Apple pie

Para agregar los ingredientes se adicionan una lineas de texto en el archivo Recipes/apple_pie.txt y posteriormente lo que ya sabemos, git add, git commit. Después de esto la rama master avanza a un nuevo commit llevandose con sigo el objeto HEAD y la rama lisa sigue igual:

La rama actual es master,.

Pero que pasa si quiero cambiar de rama?

git checkout lisa
Switched to branch 'lisa'

Dos cosas principalmente:

1, El contenido del archivo HEAD que es una referencia a los branches cambia ahora

cat .git/HEAD
ref: refs/heads/lisa
git branch
* lisa
  master

Larama actual de trabajo es ahora lisa

  1. Git se encarga de cambiar los archivos en los que trabajamos, los cambia por los que apunta el commit donde esta el branch lisa (en este caso el commit que inicia 5720), si revisamos el commit de lisa:

cat recipes/apple_pie.txt
Apple pie

notamos que no esta el texto con los ingredientes que se adicionaron en la rama master, es decir es otra versión de nuestro archivo, en este caso es la versión anterior de nuestro archivo recipes/apple_pie.txt

El comando checkout lo que significa es mover el HEAD (o cambiar su contenido) a que referencia a otro branch.

Adicionando los ingredientes para un Apple pie "otra vez"

Ahora se adicionan los ingredientes que utiliza lisa para su pie en recipes/apple_pie.txt, se repite el proceso de git add y git commit .

Podemos notar que ahora lisa apunta a un nuevo commit y se leva el objeto HEAD, master no cambio nada, solo lisa que ahora apunta a un nuevo commit, por lo cual podemos deducir que los branch son solo referencias hacia los commit.