# Branches

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?

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBqa5lXd4jVWIw64%2Fmaster_blob.png?generation=1568131568519193\&alt=media)

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:

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBqdmLyRwKVbxwIB%2Fmaster_reference.png?generation=1568131568426717\&alt=media)

### 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
```

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBqf41OccxyKIIjR%2FbranchLisa.png?generation=1568131568280506\&alt=media)

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:

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBqhrjQ0N5yCKkxJ%2Fmaster_lisa_branches.png?generation=1568131568286394\&alt=media)

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:

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBqjoHJ5rTvB8R8-%2Fhead_master_lisa.png?generation=1568131568620781\&alt=media)

## 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:

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBqluf-GJM_4Cj1W%2Fnewcommit_master.png?generation=1568131568467344\&alt=media)

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

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBqnRhw0c_IB1sOV%2FHead_lisa.png?generation=1568131568380446\&alt=media)

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 .**

![](https://151692080-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-LoQv9TWpDFWC4qENtD_%2F-LoQvB-gvUJ3jQ_ALANV%2F-LoQvBqpZDaqt4hI8w2z%2Fnew_commit_lisa.png?generation=1568131568800215\&alt=media)

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.
